Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在“转换视图”上单击“侦听器”,使图像视图可见_Android_Listview_View_Imageview_Onclicklistener - Fatal编程技术网

Android 在“转换视图”上单击“侦听器”,使图像视图可见

Android 在“转换视图”上单击“侦听器”,使图像视图可见,android,listview,view,imageview,onclicklistener,Android,Listview,View,Imageview,Onclicklistener,我的列表视图包含一个文本视图和一个图像视图,第一个图像视图是不可见的,通过单击每个项目,它将可见这是我的适配器: public class ContentViewrAdaptor extends BaseAdapter implements Filterable { private List<String> originalData = null; private List<String> filteredData = null; private LayoutInfla

我的列表视图包含一个
文本视图
和一个
图像视图
,第一个图像视图是
不可见的
,通过单击每个项目,它将
可见
这是我的适配器:

public class ContentViewrAdaptor extends BaseAdapter implements Filterable {

private List<String> originalData = null;
private List<String> filteredData = null;
private LayoutInflater mInflater;
private Typeface regular;
private Context context;
private ItemFilter mFilter = new ItemFilter();


public ContentViewrAdaptor(Context context, List<String> data, Typeface regular) {
    this.filteredData = data;
    this.originalData = data;
    this.regular = regular;
    this.context = context;
    mInflater = LayoutInflater.from(context);
}


public int getCount() {
    return filteredData.size();
}


public Object getItem(int position) {
    return filteredData.get(position);
}


public long getItemId(int position) {
    return position;
}

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

    final ViewHolder holder;

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.text_view, null);


        holder = new ViewHolder();
        holder.image = (ImageView) convertView.findViewById(R.id.iAccept);

        holder.text = (TextView) convertView.findViewById(R.id.contentText);
        holder.text.setTypeface(regular);

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.image.setTag(position);
    convertView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Toast.makeText(context, (Integer) holder.image.getTag() + "", Toast.LENGTH_SHORT).show();
            ViewHolder vh = (ViewHolder) v.getTag();
            ImageView iv = vh.image;
            if (iv.getVisibility() == View.VISIBLE) {
                iv.setVisibility(View.INVISIBLE);
            } else {
                iv.setVisibility(View.VISIBLE);
            }
        }
    });
    if (filteredData.get(position).contains("font"))
        holder.text.setText(Html.fromHtml(filteredData.get(position)));
    else
        holder.text.setText(filteredData.get(position));
    return convertView;
}


static class ViewHolder {
    ImageView image;
    TextView text;
}


public Filter getFilter() {
    return mFilter;
}


private class ItemFilter extends Filter {

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {

        String filterString = constraint.toString().toLowerCase();

        FilterResults results = new FilterResults();

        final List<String> list = originalData;

        int count = list.size();
        final ArrayList<String> nlist = new ArrayList<String>(count);

        String filterableString;

        for (int i = 0; i < count; i++) {
            filterableString = list.get(i);
            if (filterableString.toLowerCase().contains(filterString)) {
                filterableString = filterableString.replaceAll(filterString, "<font color='red'>" + filterString + "</font>");
                nlist.add(filterableString);
            }
        }

        results.values = nlist;
        results.count = nlist.size();

        return results;
    }


    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        filteredData = (ArrayList<String>) results.values;
        notifyDataSetChanged();
    }

}
}
公共类ContentViewrAdaptor扩展BaseAdapter实现可过滤{
私有列表originalData=null;
私有列表过滤器数据=null;
私人停车场;
私人字体规则;
私人语境;
private-ItemFilter=new-ItemFilter();
public ContentViewrAdaptor(上下文、列表数据、常规字体){
this.filteredData=数据;
this.originalData=数据;
this.regular=regular;
this.context=上下文;
mInflater=LayoutInflater.from(上下文);
}
public int getCount(){
返回filteredData.size();
}
公共对象getItem(int位置){
返回filteredData.get(位置);
}
公共长getItemId(int位置){
返回位置;
}
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
最终持票人;
if(convertView==null){
convertView=mInflater.flate(R.layout.text\u视图,空);
holder=新的ViewHolder();
holder.image=(ImageView)convertView.findViewById(R.id.iAccept);
holder.text=(TextView)convertView.findViewById(R.id.contentText);
holder.text.setTypeface(常规);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
支架.图像.设置标签(位置);
convertView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Toast.makeText(context,(Integer)holder.image.getTag()+“”,Toast.LENGTH_SHORT.show();
ViewHolder vh=(ViewHolder)v.getTag();
ImageView iv=vh图像;
if(iv.getVisibility()==View.VISIBLE){
iv.设置可见性(视图不可见);
}否则{
iv.设置可见性(视图可见);
}
}
});
if(filteredData.get(position).contains(“字体”))
holder.text.setText(Html.fromHtml(filteredData.get(position));
其他的
holder.text.setText(filteredData.get(position));
返回视图;
}
静态类视窗夹{
图像视图图像;
文本查看文本;
}
公共过滤器getFilter(){
返回过滤器;
}
私有类ItemFilter扩展了筛选器{
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
String filterString=constraint.toString().toLowerCase();
FilterResults results=新的FilterResults();
最终列表=原始数据;
int count=list.size();
最终ArrayList NLList=新ArrayList(计数);
串滤器串;
for(int i=0;i
例如,当我单击第一个项目时,第四个项目也将可见,当列表滚动时会出现此问题


有什么问题?我怎样才能解决这个问题

问题在于,您的适配器在您滚动时重复使用视图,但您仅在调用onClicked()时设置视图的状态

如果要避免这种情况,一种解决方案是使用包含视图可见性状态的辅助列表

e、 g

ArrayList visiblePositions=new ArrayList();
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
最终持票人;
if(convertView==null){
convertView=mInflater.flate(R.layout.text\u视图,空);
holder=新的ViewHolder();
holder.image=(ImageView)convertView.findViewById(R.id.iAccept);
holder.text=(TextView)convertView.findViewById(R.id.contentText);
holder.text.setTypeface(常规);
convertView.setTag(支架);
} 
else holder=(ViewHolder)convertView.getTag();
支架.图像.设置标签(位置);
调整图像可见性(viewHolder,visiblePositions.contains(position));
convertView.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
点击视图(支架、位置);
}
});
if(filteredata.get(position).contains(“font”))holder.text.setText(Html.fromHtml(filteredata.get(position));
else holder.text.setText(filteredData.get(position));
返回视图;
}
单击ViewHolder时的公共无效(ViewHolder ViewHolder,整数位置){
if(visiblePositions.contains(位置)){
调整图像可见性(viewHolder.image,false);
visibilePositions.移除(位置);
} 
否则{
调整图像可见性(viewHolder.image,true);
可见位置。添加(位置);
}
}
public void adjustImageVisibility(ImageView ImageView,布尔可见){
如果(可见)imageView.setVisibility(视图.不可见);
else imageView.setVisibility(View.VISIBLE);
}
在构建要显示的视图时,支持单击项的位置,并让适配器的getView()方法使用该位置,这应该对您有用

注意:如果由于某种原因列表的顺序发生变化,此解决方案可能会失败

更好的方法是创建一个对象,该对象既包含要显示的字符串,又包含一个用于可见性的布尔值,然后让对象自己处理它

但是这个
ArrayList<Integer> visiblePositions = new ArrayList<Integer>();

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

    final ViewHolder holder;

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.text_view, null);

        holder = new ViewHolder();
        holder.image = (ImageView) convertView.findViewById(R.id.iAccept);

        holder.text = (TextView) convertView.findViewById(R.id.contentText);
        holder.text.setTypeface(regular);

        convertView.setTag(holder);
    } 
    else holder = (ViewHolder) convertView.getTag();

    holder.image.setTag(position);
    adjustImageVisibility(viewHolder, visiblePositions.contains(position));

    convertView.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            onViewClicked(holder, position);
        }
    });

    if (filteredData.get(position).contains("font")) holder.text.setText(Html.fromHtml(filteredData.get(position)));            
    else holder.text.setText(filteredData.get(position));

    return convertView;
}

public void onViewClicked(ViewHolder viewHolder, Integer position){
    if (visiblePositions.contains(position)) {
         adjustImageVisibility(viewHolder.image, false);
         visibilePositions.remove(position);
    } 
    else {
         adjustImageVisibility(viewHolder.image, true);
         visiblePositions.add(position);
    }
}

public void adjustImageVisibility(ImageView imageView, boolean visible){
    if(visible) imageView.setVisibility(View.INVISIBLE);
    else imageView.setVisibility(View.VISIBLE);
}
private boolean[] mImageStates;

public ContentViewrAdaptor(Context context, List<String> data, Typeface regular) {
    ...
    mImageStates = new boolean[getCount()];
}

public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder holder;

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.text_view, null);

        holder = new ViewHolder();
        holder.image = (ImageView) convertView.findViewById(R.id.iAccept);

        holder.text = (TextView) convertView.findViewById(R.id.contentText);
        holder.text.setTypeface(regular);

        convertView.setTag(holder);

        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, (Integer) holder.image.getTag() + "", Toast.LENGTH_SHORT).show();

                ImageView imageView = holder.image;
                int position = Integer.parseInt(imageView.getTag().toString());
                if (mImageStates[position]) {
                    imageView.setVisibility(View.INVISIBLE);
                    mImageStates[position] = false;
                } else {
                    imageView.setVisibility(View.VISIBLE);
                    mImageStates[position] = true;
                }
            }
        });
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.image.setTag(position);

    if (mImageStates[position]) {
        holder.image.setVisibility(View.INVISIBLE);
    } else {
        holder.image.setVisibility(View.VISIBLE);
    }

    if (filteredData.get(position).contains("font")) {
        holder.text.setText(Html.fromHtml(filteredData.get(position)));
    } else {
        holder.text.setText(filteredData.get(position));
    }

    return convertView;
}