【问题标题】:(Android) How do i access and modify a specific element in a custom listview, seeing as it uses a custom adapter?(Android) 我如何访问和修改自定义列表视图中的特定元素,因为它使用自定义适配器?
【发布时间】:2014-09-19 03:12:33
【问题描述】:

我有一个自定义列表视图,这是它的 layout.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <ImageView
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:id="@+id/playerToken"/>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/playerName"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/playerMoney"/>

        </LinearLayout>

    </LinearLayout>

</LinearLayout>

这里是一个自定义适配器,它接受一个玩家对象数组,其中存储了玩家姓名、代表他的代币和他的资金余额等信息。适配器获取该信息并填充我的自定义列表,如上面的布局。

public class MyAdapter extends ArrayAdapter<Player> {

    public MyAdapter(Context context, Player[] values) {

        super(context, R.layout.activity_banking_layout, values);

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater theInflater = LayoutInflater.from(getContext());

        View theView = theInflater.inflate(R.layout.activity_banking_layout, parent, false);

        Player player = getItem(position);

        TextView playerNameText = (TextView) theView.findViewById(R.id.playerName);
        TextView playerMoneyText = (TextView) theView.findViewById(R.id.playerMoney);
        ImageView playerToken = (ImageView) theView.findViewById(R.id.playerToken);

        playerNameText.setText(player.getName());
        playerMoneyText.setText(Integer.toString(player.getMoney()));


        int rId = theView.getResources().getIdentifier(player.getToken(), "drawable",
                                                       getContext().getPackageName());
        playerToken.setImageResource(rId);

        return theView;
    }
}

这只是显示我们正在调整的 listView 的布局:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:padding="10dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/bankListView" />

</LinearLayout>

所以基本上,我的列表是在显示列表的活动的 onCreate 方法中创建和适配器的。之后,我的列表项可以打开一个上下文菜单,并根据选择的内容来操作播放器对象。我希望我的列表能够反映这些更改,所以我想知道如何访问自定义列表的特定部分并对其进行编辑。例如,我的自定义列表有一个玩家图标,右侧是玩家姓名,名称下方是金额。假设我想更改特定玩家的金额并将该更改反映在列表中,我如何在该 ListView 中的特定位置访问该特定 TextView?

【问题讨论】:

    标签: android android-listview android-arrayadapter


    【解决方案1】:

    由于您的适配器'MyAdapter'扩展了ArrayAdapter,您可以尝试使用getItem(int position),它返回指定位置的列表项; Player 对象在您的情况下。从那里,您可以修改对象的数据成员(金额),然后使用notifyDataSetChanged() 刷新列表以反映您的更改。

    如果您想知道单击列表项的索引/位置,那么您的问题将与此 one 重复。

    【讨论】:

      【解决方案2】:

      考虑以下方法,而不是操纵文本视图:

      将 Player[] 数组设为全局变量,而不是将其传递给构造函数。然后直接操作Player对象,然后调用 notifyDataSetChanged() 在您的适配器上,它将自动更新您正确的文本视图。

      private Player[] values;
      
      public void onCreate(Bundle s){
           /*your onCreate things*/
      
           MyAdapter adapter = new MyAdapter(this);
      
           // update player 5 from array
           values[4].money = newMoneyVal;
      
           // after updating, call notifyDataSetChanged()
           adapter.notifyDataSetChanged();
      }
      
      public class MyAdapter extends ArrayAdapter<Player> {
      
          public MyAdapter(Context context) {
      
              super(context, R.layout.activity_banking_layout, values);
      
          }
      
          /*rest of your adapter class*/
      }
      

      让我知道这是否有效或如果您有任何问题

      【讨论】:

      • 这是非常危险的,不是使用 ArrayAdapter 的正确方法。如果发生过滤操作,外部修改将失败。
      【解决方案3】:

      你只需要实现一个 onlistitemclick 监听器,像这样:

      @Override
      protected void onListItemClick(ListView l, View v, int pos, long id) {
          super.onListItemClick(l, v, pos, id);
          l[pos].findViewById(R.id.yourTagName).setText("ChangedValue");//to be adapted
      }
      

      【讨论】:

      • 这将在下次数据集更新时中断,因为适配器没有关于此更改的信息。您需要按照@yazjisuhail 的建议更改基础数据。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 2014-05-02
      相关资源
      最近更新 更多