www.91084.com

GVKun编程网logo

android – MVVMCross在MvxBindableListView中更改ViewModel(android mvvm使用)

34

本文的目的是介绍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使用)

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 的使用案例

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模式

Android Kotlin中使用 LiveData、ViewModel快速实现MVVM模式

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

使用 Kotlin 实现 MVVM(Model-View-ViewModel)模式是开发 Android 应用程序的一种常见架构方式。MVVM 模式将应用程序的 UI 逻辑和业务逻辑分离,使用 LiveData、ViewModel 和 DataBinding 可以使代码更加模块化和可维护。以下是实现 MVVM 模式的步骤和示例:

步骤

  1. Model 层:负责数据的获取和处理,如数据库操作、网络请求等。
  2. View 层:负责 UI 的显示,例如 Activity、Fragment。
  3. 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 来更新数据。
  • 使用 LiveDataMutableLiveData 来观察数据变化。

3、 View 层

  • 使用 DataBinding 进行数据绑定。
  • 布局文件 activity_main.xml 通过 <data> 标签声明 ViewModel 变量。
  • MainActivity 中通过 ViewModelProvider 初始化 ViewModel 并进行数据绑定。

优点

  • 分离关注点:UI 和业务逻辑分离,增加代码的模块化和可维护性。
  • 双向数据绑定:通过 DataBinding 实现双向数据绑定,减少手动更新 UI。
  • 可测试性高:业务逻辑在 ViewModel 中,便于进行单元测试。

通过上述步骤和代码,你可以在 Kotlin 中实现一个基本的 MVVM 架构。实际开发中,可能还需要根据具体需求扩展和改进。


欢迎关注我的公众号AntDream查看更多精彩文章!

Android ScrollView嵌套ExpandableListView显示不正常的问题的解决办法

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头

android – EditText内容在ExpandableListView内部消失时单击下一个ExpandableListView头

我有一个可扩展列表视图项目中的edittext子项.然后,我在这个edittext中输入了一个文本,但是当我点击其他可扩展列表视图标题时,我输入的文本消失了.

我已经在我的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;
  }

解决方法

每当您展开另一个组列表刷新时,您将获得另一个没有文本的EditText实例.您输入文本的EditText将成为另一个groupView的子对象.

所以我建议你创建一个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中更改ViewModelandroid mvvm使用的分享就到这里,谢谢您的阅读,如果想了解更多关于027 Android 可扩展的 listview:ExpandableListView 的使用案例、Android Kotlin中使用 LiveData、ViewModel快速实现MVVM模式、Android ScrollView嵌套ExpandableListView显示不正常的问题的解决办法、android – EditText内容在ExpandableListView内部消失时单击下一个ExpandableListView头的相关信息,可以在本站进行搜索。

本文标签: