生也有涯,知也无涯。这篇文章主要讲述滚动时,Android Listview重置更改相关的知识,希望能为你提供帮助。
我正在使用带有自定义适配器的ListFragment。
我的适配器有一个textview
和一个带箭头的隐藏imageview
。当用户选择项目时,箭头显示并且背景颜色发生变化。但是,当用户滚动列表时,所有更改都将恢复为默认值。
我应该怎么做才能解决这些变化?
编辑:
我的适配器类..
public class PropriedadeAdapter extends BaseAdapter {
private Context context;
private List<
Propriedades>
prop;
public PropriedadeAdapter(Context context, List<
Propriedades>
prop) {
this.context = context;
this.prop = prop;
}public int getCount() {
return prop.size();
}public Object getItem(int position) {
return prop.get(position);
}public long getItemId(int position) {
return position;
}public View getView(int position, View convertView, ViewGroup parent) {
// Recupera o produto da posi??o atual
Propriedades p = prop.get(position);
// Layout XML
int arquivoLayout = R.layout.lista_prop;
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(arquivoLayout, null);
// Atualiza o valor do Text para o nome do produto
TextView textNome = (TextView) v.findViewById(R.id.nome);
textNome.setText(p.getNome());
return v;
}
}
我的片段课..
public class frag_lista extends ListFragment{ImageView ultimoItem = null;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
ArrayList<
Propriedades>
props = new ArrayList<
Propriedades>
();
for(int i = 0;
i <
50;
i++)
{
Propriedades prop = new Propriedades();
prop.setNome("FRUTA "+i);
props.add(prop);
}
setListAdapter(new PropriedadeAdapter(this.getActivity(),props));
}@Override
public void onListItemClick(ListView l, View v, int position, long id) {
ImageView seta = (ImageView)v.findViewById(R.id.imgSeta);
seta.setVisibility(0);
LinearLayout linha = (LinearLayout)v.findViewById(R.id.linha);
linha.setBackgroundColor(Color.GRAY);
if(ultimoItem != null)
{
ultimoItem.setVisibility(4);
}
ultimoItem = seta;
}}
【滚动时,Android Listview重置更改】我该怎么做才能坚持onListItemClick方法的变化????
答案根据您的评论,我认为您没有正确使用适配器。
Adapter提供ListView自动调用的方法。
您应该在内存中保留选定的索引,并在每次调用getView(...)方法时恢复View状态(从position参数jusging)。
查找有关ListView和Adapter的教程。
编辑:
请注意,我没有测试代码,但它可能是这样的:
// TeddyBearFr: Class name typically starts with a capital letter! Frag_lista, not frag_lista
public class frag_lista extends ListFragment{ImageView ultimoItem = null;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
ArrayList<
Propriedades>
props = new ArrayList<
Propriedades>
();
for(int i = 0;
i <
50;
i++)
{
Propriedades prop = new Propriedades();
prop.setNome("FRUTA "+i);
props.add(prop);
}
setListAdapter(new PropriedadeAdapter(this.getActivity(),props));
}@Override
public void onListItemClick(ListView l, View v, int position, long id) {// TeddyBearFr: notify the adapter
( (PropriedadeAdapter) this.getListAdapter() ).onListItemClick(position);
// TeddyBearFr: your last item must be managed in the getView(...) method of the Adapter
//if(ultimoItem != null)
//{
//ultimoItem.setVisibility(4);
// TeddyBearFr: don't use integer like this, use android constants! View.INVISIBLE
//}
//ultimoItem = seta;
}}public class PropriedadeAdapter extends BaseAdapter {
private final static String TAG = "PropriedadeAdapter";
private Context context;
private List<
Propriedades>
prop;
private Set<
Integer>
mSelectedItemsPosition;
public PropriedadeAdapter(Context context, List<
Propriedades>
prop) {
this.context = context;
this.prop = prop;
// TeddyBearFr: set to store selected indexes
this.mSelectedItemsPosition = new HashSet<
Integer>
();
}public int getCount() {
return prop.size();
}public Object getItem(int position) {
return prop.get(position);
}public long getItemId(int position) {
return position;
}public View getView(int position, View convertView, ViewGroup parent) {
Log.d(TAG, "getView(position=" + position + ", convertView=" + convertView + ", parent=" + parent + ")" );
// Recupera o produto da posi??o atual
Propriedades p = prop.get(position);
// TeddyBearFr: use existing view if exist ;
otherwise create a new one
View v;
if( convertView == null ){
// Layout XML
int arquivoLayout = R.layout.lista_prop;
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(arquivoLayout, null);
}
else{
v = convertView;
}// Atualiza o valor do Text para o nome do produto
TextView textNome = (TextView) v.findViewById(R.id.nome);
textNome.setText(p.getNome());
// TeddyBearFr: update view according its selection state
ImageView seta = (ImageView)v.findViewById(R.id.imgSeta);
boolean isViewSelected = this.mSelectedItemsPosition.contains(position);
int visibility = ( isViewSelected ? VIEW.VISIBLE : VIEW.GONE );
seta.setVisibility(visibility);
LinearLayout linha = (LinearLayout)v.findViewById(R.id.linha);
linha.setBackgroundColor( isViewSelected ? Color.GRAY : Color.RED );
if( position == getCount()-1 ){
// perform special processes on the last item of the list if needed
}return v;
}// TeddyBearFr: callback when click
public void onListItemClick(int position){
Log.d(TAG, "onListItemClick(position=" + position + ")");
// update selected index data
// Note that I haven't tested if it works. Because native integer "position" will be wrapped in Integer object, there's a chance that the Set compares the references on objects instead of their value
if( this.mSelectedItemsPosition.contains(position) ){
this.mSelectedItemsPosition.remove(position);
}
else{
this.mSelectedItemsPosition.add(position);
}// ask the list to be refreshed ->
you'll see that getView() will be called only for each displayed view
this.notifyDataSetChanged();
}}
另一答案convertView有两个状态,它们是null而不是null。您的问题发生是因为eveytime yout getView()调用新的布局inflater实例正在初始化。仅当convertView为null时才初始化inflater。
public View getView(int position, View convertView, ViewGroup parent) {Propriedades p = prop.get(position);
int arquivoLayout = R.layout.lista_prop;
View v;
if (convertView==null){
v = inflater.inflate(arquivoLayout, null);
}
else {
v = convertView;
}// Atualiza o valor do Text para o nome do produto
TextView textNome = (TextView) v.findViewById(R.id.nome);
textNome.setText(p.getNome());
return v;
}
另外,请记住将inflater声明为字段。
LayoutInflater inflater = null;
并在构造函数中初始化它。
public PropriedadeAdapter(Context context, List<
Propriedades>
prop) {
this.context = context;
this.prop = prop;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
推荐阅读
- ListView崩溃。不工作的应用程序Android Studio模拟器
- 专业人士的Git工作流程(良好的Git指南)
- 单元测试,如何编写可测试的代码及其重要性
- Docker入门(简化DevOps)
- React组件如何使UI测试变得容易
- 充分利用PHP日志文件(实用指南)
- 使用GitHub Webhooks自动部署Web应用程序
- 针对开发人员的设计工作流程教程(按时交付更好的UI/UX)
- CSS布局教程(从经典方法到最新技术)