本文的目的是介绍android–MVVMCross在MvxBindableListView中更改ViewModel的详细情况,特别关注androidmvvm使用的相关信息。我们将通过专业的研究、有关数
本文的目的是介绍android – MVVMCross在MvxBindableListView中更改ViewModel的详细情况,特别关注android mvvm使用的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解android – MVVMCross在MvxBindableListView中更改ViewModel的机会,同时也不会遗漏关于027 Android 可扩展的 listview:ExpandableListView 的使用案例、Android Kotlin中使用 LiveData、ViewModel快速实现MVVM模式、Android ScrollView嵌套ExpandableListView显示不正常的问题的解决办法、android – EditText内容在ExpandableListView内部消失时单击下一个ExpandableListView头的知识。
本文目录一览:- android – MVVMCross在MvxBindableListView中更改ViewModel(android mvvm使用)
- 027 Android 可扩展的 listview:ExpandableListView 的使用案例
- Android Kotlin中使用 LiveData、ViewModel快速实现MVVM模式
- Android ScrollView嵌套ExpandableListView显示不正常的问题的解决办法
- android – EditText内容在ExpandableListView内部消失时单击下一个ExpandableListView头
android – MVVMCross在MvxBindableListView中更改ViewModel(android mvvm使用)
我的Android应用程序的问题很小,我不知道如何使用MVVM Cross解决它.
这是我的模特
public class Article
{
string Label{ get; set; }
string Remark { get; set; }
}
我的viewmodel
public class Articleviewmodel: Mvxviewmodel
{
public List<Article> Articles;
....
}
我的layout.axml
…
<LinearLayout
android:layout_width="0dip"
android:layout_weight="6"
android:layout_height="fill_parent"
android:orientation="vertical"
android:id="@+id/layoutArticleList">
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/editSearch"
android:text=""
android:singleLine="True"
android:selectAllOnFocus="true"
android:capitalize="characters"
android:drawableLeft="@drawable/ic_search_24"
local:MvxBind="{'Text':{'Path':'Filter','Mode':'TwoWay'}}"
/>
<Mvx.MvxBindableListView
android:id="@+id/listviewArticle"
android:choiceMode="singleChoice"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
local:MvxItemTemplate="@layout/article_rowlayout"
local:MvxBind="{'ItemsSource':{'Path':'Articles'}}" />
</LinearLayout>
...
这就是我的问题,“article_rowlayout”
...
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/blue">
<TextView
android:id="@+id/rowArticleLabel"
android:layout_width="0dip"
android:layout_weight="14"
android:layout_height="wrap_content"
android:textSize="28dip"
local:MvxBind="{'Text':{'Path':'Label'}}" />
<ImageButton
android:src="@drawable/ic_modify"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="wrap_content"
android:id="@+id/rowArticleButtonModify"
android:background="@null"
android:focusable="false"
android:clickable="true"
local:MvxBind="{'Click':{'Path':'MyTest'}}"
/>
...
名为“MyTest”的“Click”命令链接在MvxBindableListView给出的项目上.换句话说,单击在我的模型“文章”中搜索命令“MyTest”,而不是我的viewmodel.如何更改该行为以链接我的viewmodel“Articleviewmodel”,它负责我的MvxBindableListView?
有什么建议?
解决方法:
您的分析对于click事件尝试绑定的位置肯定是正确的.
我通常采用两种方法:
>在列表上使用ItemClick
>继续使用Click但在viewmodel端进行一些重定向.
所以…… 1
本教程中的Main Menu有一个viewmodel,有点像:
public class MainMenuviewmodel
: Mvxviewmodel
{
public List<T> Items { get; set; }
public IMvxCommand Showitemcommand
{
get
{
return new MvxRelayCommand<T>((item) => /* do action with item */ );
}
}
}
这在axml中用作:
<Mvx.MvxBindableListView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res/Tutorial.UI.Droid"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
local:MvxBind="{'ItemsSource':{'Path':'Items'},'ItemClick':{'Path':'Showitemcommand'}}"
local:MvxItemTemplate="@layout/listitem_viewmodel"
/>
这种方法只能对整个列表项中的ItemClick进行 – 而不是对列表项中的单个子视图进行.
还是… 2
由于我们在mvx中没有任何RelativeSource绑定指令,因此可以在viewmodel / Model代码中完成此类重定向.
这可以通过呈现Model对象的行为启用包装器而不是Model对象本身来完成 – 例如使用List< ActiveArticle>:
public ActiveArticle
{
Article _article;
Articleviewmodel _parent;
public WrappedArticle(Article article, Articleviewmodel parent)
{
/* assignment */
}
public IMvxCommand TheCommand { get { return MvxRelayCommand(() -> _parent.DoStuff(_article)); } }
public Article TheArticle { get { return _article; } }
}
然后你的axml必须使用如下绑定:
<TextView ...
local:MvxBind="{'Text':{'Path':'TheArticle.Label'}}" />
和
<ImageButton
...
local:MvxBind="{'Click':{'Path':'TheCommand.MyTest'}}" />
这种方法的一个例子是使用WithCommand的会议样本
但请注意,使用WithCommand< T>时我们发现内存泄漏 – 基本上GarbageCollection拒绝收集嵌入式MvxRelayCommand – 这就是为什么WithCommand< T>是Idisposable,为什么BaseSessionListViewModel清除列表并在分离视图时处理WithCommand元素.
评论后更新:
如果您的数据列表很大 – 并且您的数据是固定的(您的文章是没有PropertyChanged的模型),并且您不希望产生创建大型List< WrappedArticle>的开销.那么解决这个问题的一种方法可能是使用WrappingList< T>类.
这与Microsoft代码中采用的方法非常相似 – 例如在WP7 / Silverlight – http://shawnoster.com/blog/post/Improving-ListBox-Performance-in-Silverlight-for-Windows-Phone-7-Data-Virtualization.aspx中的虚拟化列表中
对于您的文章,这可能是:
public class Articleviewmodel: Mvxviewmodel
{
public WrappingList<Article> Articles;
// normal members...
}
public class Article
{
public string Label { get; set; }
public string Remark { get; set; }
}
public class WrappingList<T> : IList<WrappingList<T>.Wrapped>
{
public class Wrapped
{
public IMvxCommand Command1 { get; set; }
public IMvxCommand Command2 { get; set; }
public IMvxCommand Command3 { get; set; }
public IMvxCommand Command4 { get; set; }
public T TheItem { get; set; }
}
private readonly List<T> _realList;
private readonly Action<T>[] _realAction1;
private readonly Action<T>[] _realAction2;
private readonly Action<T>[] _realAction3;
private readonly Action<T>[] _realAction4;
public WrappingList(List<T> realList, Action<T> realAction)
{
_realList = realList;
_realAction = realAction;
}
private Wrapped Wrap(T item)
{
return new Wrapped()
{
Command1 = new MvxRelayCommand(() => _realAction1(item)),
Command2 = new MvxRelayCommand(() => _realAction2(item)),
Command3 = new MvxRelayCommand(() => _realAction3(item)),
Command4 = new MvxRelayCommand(() => _realAction4(item)),
TheItem = item
};
}
#region Implementation of Key required methods
public int Count { get { return _realList.Count; } }
public Wrapped this[int index]
{
get { return Wrap(_realList[index]); }
set { throw new NotImplementedException(); }
}
#endregion
#region NonImplementation of other methods
public IEnumerator<Wrapped> GetEnumerator()
{
throw new NotImplementedException();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public void Add(Wrapped item)
{
throw new NotImplementedException();
}
public void Clear()
{
throw new NotImplementedException();
}
public bool Contains(Wrapped item)
{
throw new NotImplementedException();
}
public void copyTo(Wrapped[] array, int arrayIndex)
{
throw new NotImplementedException();
}
public bool Remove(Wrapped item)
{
throw new NotImplementedException();
}
public bool IsReadOnly { get; private set; }
#endregion
#region Implementation of IList<datefilter>
public int IndexOf(Wrapped item)
{
throw new NotImplementedException();
}
public void Insert(int index, Wrapped item)
{
throw new NotImplementedException();
}
public void RemoveAt(int index)
{
throw new NotImplementedException();
}
#endregion
}
027 Android 可扩展的 listview:ExpandableListView 的使用案例
1.ExpandableListView 简介
ExpandableListView 是一种用于垂直滚动展示两级列表的视图,和 ListView 的不同之处就是它可以展示两级列表,分组可以单独展开显示子选项。这些选项的数据是通过 ExpandableListAdapter 关联的。
2.xml 页面布局
(1) 主界面布局 (CommonNumberQueryActivity 对应布局)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".CommonNumberQueryActivity">
<TextView
style="@style/TitleStyle"
android:text="常用号码查询" />
<!--可以扩展的listview:ExpandableListView-->
<ExpandableListView
android:id="@+id/elv_common_number"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ExpandableListView>
</LinearLayout>
(2)elv_child_item_group.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_group_name"
android:text="分组名称"
android:layout_marginLeft="40dp"
android:textSize="16sp"
android:textColor="@color/red"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
(3)elv_child_item_child.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_name"
android:text="电话名称"
android:textSize="16sp"
android:textColor="#000"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv_number"
android:text="电话号码"
android:textSize="16sp"
android:textColor="#000"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
3.java 后台代码
package com.example.administrator.test62360safeguard;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;
import com.example.administrator.test62360safeguard.engine.CommonNumberDao;
import java.util.List;
public class CommonNumberQueryActivity extends AppCompatActivity {
ExpandableListView elv_common_number;
List<CommonNumberDao.Group> groupList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_common_number_query);
initUI();
initData();
}
/**
* 给可扩展的listview:ExpandableListView准备数据,并填充
* 首先将对应的数据库文件放入assets目录下
*/
private void initData() {
CommonNumberDao commonNumberDao=new CommonNumberDao();
//获取数据库中的数据
groupList = commonNumberDao.getGroup();
System.out.println("groupList:"+groupList);
//给ExpandableListView设置数据适配器
elv_common_number.setAdapter(new MyAdapter());
}
private void initUI() {
elv_common_number = findViewById(R.id.elv_common_number);
}
private class MyAdapter extends BaseExpandableListAdapter {
@Override
public int getGroupCount() {
return groupList.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return groupList.get(groupPosition).childList.size();
}
@Override
public CommonNumberDao.Group getGroup(int groupPosition) {
return groupList.get(groupPosition);
}
@Override
public CommonNumberDao.Child getChild(int groupPosition, int childPosition) {
return groupList.get(groupPosition).childList.get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
/**
* 固定写法不需要修改
*/
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
View view = View.inflate(getApplicationContext(), R.layout.elv_child_item_group, null);
TextView tv_group_name = view.findViewById(R.id.tv_group_name);
tv_group_name.setText(getGroup(groupPosition).name);
return view;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
View view = View.inflate(getApplicationContext(), R.layout.elv_child_item_child, null);
TextView tv_name = view.findViewById(R.id.tv_name);
TextView tv_number = view.findViewById(R.id.tv_number);
tv_name.setText(getChild(groupPosition, childPosition).name);
tv_number.setText(getChild(groupPosition, childPosition).number);
return view;
}
/**
* @return 孩子节点是否响应事件
*/
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
}
}
4. 效果图
Android Kotlin中使用 LiveData、ViewModel快速实现MVVM模式
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点
使用 Kotlin 实现 MVVM(Model-View-ViewModel)模式是开发 Android 应用程序的一种常见架构方式。MVVM 模式将应用程序的 UI 逻辑和业务逻辑分离,使用 LiveData、ViewModel 和 DataBinding 可以使代码更加模块化和可维护。以下是实现 MVVM 模式的步骤和示例:
步骤
- Model 层:负责数据的获取和处理,如数据库操作、网络请求等。
- View 层:负责 UI 的显示,例如 Activity、Fragment。
- ViewModel 层:作为数据和 UI 的桥梁,负责预处理数据,使之适合 UI 显示。使用
LiveData
来观察数据变化。
依赖项
在开始之前,需要在项目的 build.gradle
文件中添加相关依赖项:
dependencies {
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
implementation "androidx.databind:databinding-runtime:3.4.1"
}
代码示例
1. Model 类
// User.kt
data class User(val name: String, val age: Int)
2. ViewModel 类
// UserViewModel.kt
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class UserViewModel : ViewModel() {
private val _user = MutableLiveData<User>()
val user: LiveData<User> get() = _user
fun updateUserData(name: String, age: Int) {
_user.value = User(name, age)
}
}
3. View 层
使用 DataBinding 在布局文件中实现 UI:
<!-- activity_main.xml -->
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="viewModel"
type="com.example.app.UserViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/userName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.user.name}" />
<TextView
android:id="@+id/userAge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.user.age}" />
<Button
android:id="@+id/updateButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Update"
android:onClick="@{() -> viewModel.updateUserData(''John Doe'', 30)}"/>
</LinearLayout>
</layout>
在 Activity
中进行实例化和数据绑定:
// MainActivity.kt
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
import com.example.app.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var viewModel: UserViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 初始化 ViewModel
viewModel = ViewModelProvider(this).get(UserViewModel::class.java)
// 数据绑定
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.viewModel = viewModel
binding.lifecycleOwner = this
}
}
详细解释
1、 Model 层: User
数据类表示用户数据。
2、 ViewModel 层:
UserViewModel
类管理用户数据,并提供方法updateUserData
来更新数据。- 使用
LiveData
和MutableLiveData
来观察数据变化。
3、 View 层:
- 使用 DataBinding 进行数据绑定。
- 布局文件
activity_main.xml
通过<data>
标签声明ViewModel
变量。 MainActivity
中通过ViewModelProvider
初始化ViewModel
并进行数据绑定。
优点
- 分离关注点:UI 和业务逻辑分离,增加代码的模块化和可维护性。
- 双向数据绑定:通过 DataBinding 实现双向数据绑定,减少手动更新 UI。
- 可测试性高:业务逻辑在 ViewModel 中,便于进行单元测试。
通过上述步骤和代码,你可以在 Kotlin 中实现一个基本的 MVVM 架构。实际开发中,可能还需要根据具体需求扩展和改进。
欢迎关注我的公众号AntDream查看更多精彩文章!
Android ScrollView嵌套ExpandableListView显示不正常的问题的解决办法
Android ScrollView嵌套ExpandableListView显示不正常的问题的解决办法
前言:
关于ScrollView嵌套ExpandableListView导致ExpandableListView显示不正常的问题解决方法有很多,在这里介绍一种小编亲自测试通过的方法。
重写ExpandableListView:
实例代码:
package com.jph.view; import android.content.Context; import android.util.AttributeSet; import android.widget.ExpandableListView; /** * 重写ExpandableListView以解决ScrollView嵌套ExpandableListView *<br> 导致ExpandableListView显示不正常的问题 * @author jph * Date:2014.10.21 */ public class CustomExpandableListView extends ExpandableListView { public CustomExpandableListView(Context context) { super(context); // Todo Auto-generated constructor stub } public CustomExpandableListView(Context context,AttributeSet attrs) { super(context,attrs); // Todo Auto-generated constructor stub } public CustomExpandableListView(Context context,AttributeSet attrs,int defStyle) { super(context,attrs,defStyle); // Todo Auto-generated constructor stub } @Override protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) { // Todo Auto-generated method stub int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec,expandSpec); } }
在XML中将ExpandableListView替换为重写的ExpandableListView即可。
<com.jph.view.CustomExpandableListView android:id="@+id/elItems" android:layout_width="match_parent" android:layout_height="wrap_content"/>
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
android – EditText内容在ExpandableListView内部消失时单击下一个ExpandableListView头
我已经在我的Manifest.xml和许多其他可能的修补程序中使用了android:windowSoftInputMode =“adjustPan”,但没有工作.
这是我的适配器
public class ExpendableAdapter extends Baseexpandablelistadapter { private Context _context; private List<String> _listDataHeader; private HashMap<String,List<ExpandItemmodel>> _listDataChild; public ExpendableAdapter(Context context,List<String> listDataHeader,HashMap<String,List<ExpandItemmodel>> listChildData) { this._context = context; this._listDataHeader = listDataHeader; this._listDataChild = listChildData; } @Override public Object getChild(int groupPosition,int childPosititon) { return this._listDataChild.get(this._listDataHeader.get(groupPosition)) .get(childPosititon); } @Override public long getChildId(int groupPosition,int childPosition) { return childPosition; } @Override public View getChildView(final int groupPosition,final int childPosition,boolean isLastChild,View convertView,ViewGroup parent) { final ExpandItemmodel childText = (ExpandItemmodel) getChild(groupPosition,childPosition); if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) this._context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.list_item,null); } final EditText etTotal = (EditText)convertView .findViewById(R.id.et_total); etTotal.setText(childText.getTotal); return convertView; } @Override public int getChildrenCount(int groupPosition) { return this._listDataChild.get(this._listDataHeader.get(groupPosition)) .size(); } @Override public Object getGroup(int groupPosition) { return this._listDataHeader.get(groupPosition); } @Override public int getGroupCount() { return this._listDataHeader.size(); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public View getGroupView(int groupPosition,boolean isExpanded,ViewGroup parent) { String headerTitle = (String) getGroup(groupPosition); if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) this._context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.list_group,null); } TextView tvHeader = (TextView) convertView .findViewById(R.id.tv_header); tvHeader.setTypeface(null,Typeface.BOLD); tvHeader.setText(headerTitle); return convertView; } @Override public boolean hasstableIds() { return true; } @Override public boolean isChildSelectable(int groupPosition,int childPosition) { return true; } }
这是布局:
<RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/rl_expen_but" android:layout_below="@+id/rl_ats_draft2" android:layout_above="@+id/selanjutnya" > <ExpandableListView android:background="@color/cardview_light_background" android:id="@+id/lvExp" android:descendantFocusability="beforeDescendants" android:layout_height="wrap_content" android:layout_width="match_parent" android:animateLayoutChanges="true"/> <View android:layout_below="@+id/lvExp" android:layout_width="match_parent" android:layout_height="1dp" android:background="#bebebe"/> </RelativeLayout>
上面的代码有什么问题吗?谢谢.
编辑:
这是我的代码看起来像我的chandil03建议我编辑.当展开头文件时,可扩展列表视图不再刷新.但是奇怪的是,当我在grouptext 0和child position 0中的edittext中键入值时,在不同goupposition和childposition中的某些其他edittext中,会出现与之前的edittext相同的确切值.或者甚至陌生人,以前的edittext的价值观有时被剥夺.
static class ViewHolder { protected View et; public void addView(View et){ this.et = et; } } @Override public View getChildView(final int groupPosition,ViewGroup parent) { final ExpandItemmodel childText = (ExpandItemmodel) getChild(groupPosition,childPosition); ViewHolder viewHolder; if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) this._context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.list_item,null); viewHolder = new ViewHolder(); viewHolder.addView(convertView .findViewById(R.id.et_total)); convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder)convertView.getTag(); } final EditText etTotal = (EditText)convertView .findViewById(R.id.et_total); etTotal.setText(childText.getTotal); return convertView; }
解决方法
所以我建议你创建一个ViewHolder类并保持你的视图,并将其设置为一个标签,并在getView()中检查convertView是否已经完成.只需从convertView添加else part和getTag,并相应地设置值.
例如:
@Override public View getGroupView(int groupPosition,ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = inflater.inflate(R.layout.my_layout,parent,false); ViewHolder holder = new ViewHolder(); // View holder to save views. holder.addView(v.findViewById(R.id.myView)); v.setTag(holder); } else{ ViewHolder holder = (ViewHolder) v.getTag(); // get tag and set values // Do whatever you need to with the group view } return v; }
编辑1
我修改了你的代码也查看评论.
@Override public View getChildView(final int groupPosition,ViewGroup parent) { final ExpandItemmodel childText = (ExpandItemmodel) getChild(groupPosition,childPosition); ViewHolder holder; if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) this._context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.list_item,null); holder = new ViewHolder(convertView); convertView.setTag(holder); }else { holder = (ViewHolder) convertView.getTag(); } holder.editText.setText(childText.getTotal); // Here whatever you will type in edittext will be overwritten by the value of 'childText.getTotal'. So after you are done writing in edit text make sore you change that in "_listDataChild" list. return convertView; } /**This is a class that holds view,Here i m not talking about support.v7.widget.RecyclerView.ViewHolder class. Though concept is more or less same.*/ class ViewHolder{ EditText editText; public ViewHolder(View v) { editText = (EditText) v.findViewById(R.id.et_total); } }
编辑2
在getChildView()方法中添加以下代码.
holder.editText.setonFocuschangelistener(new View.OnFocuschangelistener() { @Override public void onFocusChange(View v,boolean hasFocus) { if(!hasFocus) childText.getTotal = holder.editText.getText().toString(); // In java variable contains reference of Object so when you change childText object,it will be reflected in same HashMap you are getting data from. } });
我们今天的关于android – MVVMCross在MvxBindableListView中更改ViewModel和android mvvm使用的分享就到这里,谢谢您的阅读,如果想了解更多关于027 Android 可扩展的 listview:ExpandableListView 的使用案例、Android Kotlin中使用 LiveData、ViewModel快速实现MVVM模式、Android ScrollView嵌套ExpandableListView显示不正常的问题的解决办法、android – EditText内容在ExpandableListView内部消失时单击下一个ExpandableListView头的相关信息,可以在本站进行搜索。
本文标签: