有没有办法遍历 ListView 的所有子视图并将它们转换为 TextView

Posted

技术标签:

【中文标题】有没有办法遍历 ListView 的所有子视图并将它们转换为 TextView【英文标题】:Is there a way to iterate through all Child Views of ListView and cast them to TextView 【发布时间】:2021-06-28 15:58:06 【问题描述】:

我正在构建一个用于探索文件的应用程序,并且正在使用名为 android.R.simple_list_item_1 的数据填充的 android 本机资源布局,我尝试通过列表视图的方法来查看是否可以在每个项目的左侧添加一个可绘制对象在我的列表中,但没有管理。因此,我从列表视图访问视图的唯一方法是在事件 OnItemClick 上,其中点击的视图作为 parameter 传递给方法,然后我可以将其格式化为可绘制对象

public class MainActivity extends AppCompatActivity 
//Define a listview for holding the data mined from storage
     public ListView mydata;
     protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
          //Define the listview
           mydata=findViewById(R.id.data);
           mydata.setOnItemClickListener(new AdapterView.OnItemClickListener() 
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
               //Cast view to TextView at position
                  TextView r=(TextView)view;
              //get the drawable and set to textview 
                    Drawable mydraw= ResourcesCompat.getDrawable(getResources(),R.drawable.ic_baseline_file_copy_24,null);
                    r.setCompoundDrawables(mydraw,null,null,null);
            
      

我是否可以在其中获取列表视图中的所有视图,通过所有视图创建 loopiterate 并转换为 TextView 数组,然后将我的可绘制对象设置为 TextView?

【问题讨论】:

您需要扩展 ListView 的 ArrayAdapter 并设法从那里调用“setCompoundDrawables()”。 我会尝试做的,谢谢,数组适配器有这个方法吗? 那是一个TextView方法。扩展的适配器仅用于膨胀“android.R.simple_list_item_1”,然后使用 THAT 方法设置其 Drawable。 你能发布一个相同的答案吗? 【参考方案1】:
final static class YourItemClass 
    ...

final static class ViewHolder 
    TextView mTextView;
    private ViewHolder(@NonNull final View simpleListItem1) 
        if (!(simpleListItem1 instanceof TextView)) throw new IllegalArgumentException("TextView was expected as root of Layout");
        this.mTextView = (TextView)simpleListItem1;
    

final class CustomArrayAdapter extends ArrayAdapter<YourItemClass> 
    private final Drawable mDrawable;
    private final LayoutInflater mLayoutInflater;
    public CustomArrayAdapter(@NonNull final Context context, @NonNull final List<YourItemClass> objects) 
        super(context, resource, objects);
        this.mDrawable = ResourcesCompat.getDrawable(getResources(),R.drawable.ic_baseline_file_copy_24,null);
        this.mLayoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
    @NonNull
    @Override
    public View getView(final int position, @Nullable View convertView, @NonNull final ViewGroup parent) 
        ViewHolder holder;
        if (convertView == null) 
            convertView = this.mLayoutInflater.inflate(android.R.layout.simple_list_item_1, parent, false);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
         else 
            holder = (ViewHolder)convertView.getTag();
        

        final YourItemClass cYourItemClassAtSpecificPosition = this.getItem(position);

        holder.mTextView.setCompoundDrawables(this.mDrawable, null, null, null);

        return convertView;
    

然后从您的活动/片段中:

private void setItemsToListView(@NonNull final List<YourItemClass> items) 
    mListView.setAdapter(new CustomArrayAdapter(getActivity(), items));

此代码将为 ListView 中显示的每一行运行“setCompoundDrawables()”。

【讨论】:

以上是关于有没有办法遍历 ListView 的所有子视图并将它们转换为 TextView的主要内容,如果未能解决你的问题,请参考以下文章

子视图中的 ListView 未正确刷新

有没有办法从 ListView 的位置获取一个完整的视图?

从容器中删除所有碎片

将视图放置在程序中 ListView 的底部

Listview + Gridview 的 Android Studio 布局预览

循环遍历Android视图的所有子视图?