有没有办法遍历 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);
我是否可以在其中获取列表视图中的所有视图,通过所有视图创建 loop
、iterate
并转换为 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的主要内容,如果未能解决你的问题,请参考以下文章