Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.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 - Fatal编程技术网

Android 修改后的按钮在滚动列表视图上重置

Android 修改后的按钮在滚动列表视图上重置,android,listview,Android,Listview,我正在使用Json数据创建一个listview。我正在填充一些图像、文本字段和按钮。当用户单击按钮时,标题将更改 问题是,如果按钮被修改并且用户滚动,listview按钮将重置为第一个状态。请查看此视频,最好解释一下: 适配器 public class FilmRequestAdapter extends ArrayAdapter<FilmRequest>{ Context context; List<FilmRequest> data; pub

我正在使用Json数据创建一个listview。我正在填充一些图像、文本字段和按钮。当用户单击按钮时,标题将更改

问题是,如果按钮被修改并且用户滚动,listview按钮将重置为第一个状态。请查看此视频,最好解释一下:

适配器

public class FilmRequestAdapter extends ArrayAdapter<FilmRequest>{
    Context context;
    List<FilmRequest> data;

    public FilmRequestAdapter(Context context, int resource, List<FilmRequest> objects) {
        super(context, resource, objects);
        // TODO Auto-generated constructor stub

        this.context=context;
        this.data=objects;
    }

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

        if (row==null) {
            LayoutInflater inflater=((Activity)context).getLayoutInflater();
            row=inflater.inflate(R.layout.film_request_list,null);
        }

        ((TextView)row.findViewById(R.id.FilmRequestFilmTitle)).setText(((FilmRequest)data.get(position)).title);
        ((TextView)row.findViewById(R.id.FilmRequestRating)).setText("Imdb Puanı : "+((FilmRequest)data.get(position)).rating);
        ((TextView)row.findViewById(R.id.FilmRequestOrder)).setText("Sıra : "+((FilmRequest)data.get(position)).order);
        ((TextView)row.findViewById(R.id.FilmRequestVoteCount)).setText("Oya adeti : "+((FilmRequest)data.get(position)).voteCount);

        Button button=(Button)row.findViewById(R.id.FilmRequestActionButton);
        String status=((FilmRequest)data.get(position)).status;
        boolean requested=((FilmRequest)data.get(position)).requested;
        boolean voted=((FilmRequest)data.get(position)).voted;
        if (status.equalsIgnoreCase("A") || status.equalsIgnoreCase("")) {

            if (requested) {
                if (voted) {
                    button.setText("Oylanmış");
                    button.setEnabled(false);
                }else {
                    button.setText("+ Oyla");
                    button.setEnabled(true);
                    button.setTag(R.string.film_request_action, "VOTEABLE");
                    button.setTag(R.string.film_request_id,((FilmRequest)data.get(position)).id);
                }
            } else {
                button.setText("Filmi İste");
                button.setEnabled(true);
                button.setTag(R.string.film_request_action, "REQUESTABLE");
                button.setTag(R.string.film_request_id,((FilmRequest)data.get(position)).imdbId);               
            }

        } else {
            button.setText("Eklenmiş");
            button.setEnabled(false);
        }

        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                FilmRequestActivity.ButtonClickFunction(context,(Button)v);
            }
        });

        ((ImageView)row.findViewById(R.id.FilmRequestPoster)).setImageBitmap(((FilmRequest)data.get(position)).bm);

        return row;

    }

}

您没有正确使用ViewHolder图案。您必须创建一个ViewHolder,并使用setTag和getTag来存储项目的状态:

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

问题是,在调用
按钮ClickFunction
时,您从未修改适配器的内容。这样,当您滚动时,将满足保持状态,并将旧字符串设置为您的按钮。我建议你更好地考虑你的设计。作为快速修复,您可以为按钮设置另一个标记,在位置添加FilmRequest对象,例如:

    final FilmRequest filmRequest = (FilmRequest)data.get(position);
    String status = filmRequest.status;
    boolean requested = filmRequest.requested;
    boolean voted = filmRequest.voted;

然后,在
按钮ClickFunction
中,检索此标记并相应地更改其
状态

我是同一个问题,但我通过此代码解决了

public class CustomizeListView extends ListActivity {

    LayoutInflater inflater;
    static int index = 0;

    // AutoCompleteTextView autoCompleteTextView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_order);
        inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, arrayList_Category);
        dataAdapter
                .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        final CustomAdapter adapter = new CustomAdapter(this,
                R.layout.activity_orderitem, arrayListItems);
        setListAdapter(adapter);
    }

    private class CustomAdapter extends ArrayAdapter<HashMap<String, Object>>
            implements OnItemSelectedListener {
        boolean[] checkBoxState;
        ViewHolder viewHolder;

        public CustomAdapter(Context context, int textViewResourceId,
                ArrayList<HashMap<String, Object>> arrayListItems) {
            // let android do the initializing :)
            super(context, textViewResourceId, arrayListItems);
            checkBoxState = new boolean[arrayListItems.size()];
        }

        // class for caching the views in a row
        private class ViewHolder {
            CheckBox checkBox;
        }

        @Override
        public View getView(final int position, View convertView,
                ViewGroup parent) {
            Log.d("getView", "getView");
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.activity_orderitem,
                        null);
                viewHolder = new ViewHolder();
                // cache the views
                convertView.setTag(viewHolder);
            } else
                viewHolder = (ViewHolder) convertView.getTag();

            viewHolder.checkBox.setChecked(checkBoxState[position]);

            viewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    if (((CheckBox) v).isChecked()) {
                        checkBoxState[position] = true;
                    } else {
                        checkBoxState[position] = false;
                    }
                }
            });

            return convertView;
        }
    }
}
public类CustomizeListView扩展了ListActivity{
充气机;
静态int指数=0;
//自动完成文本视图自动完成文本视图;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_order);
充气器=(LayoutInflater)getSystemService(Context.LAYOUT\u充气器\u SERVICE);
ArrayAdapter dataAdapter=新的ArrayAdapter(此,
android.R.layout.simple\u微调器\u项目,arrayList\u类别);
数据适配器
.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
最终CustomAdapter=新CustomAdapter(此,
R.layout.activity_orderitem,arrayListItems);
setListAdapter(适配器);
}
私有类CustomAdapter扩展了ArrayAdapter
实现MSelectedListener{
布尔[]checkBoxState;
持票人持票人;
公共CustomAdapter(上下文上下文,int textViewResourceId,
ArrayList ArrayListEMS){
//让android进行初始化:)
super(上下文、textViewResourceId、arrayListItems);
checkBoxState=新布尔值[arrayListItems.size()];
}
//类以缓存行中的视图
私有类视窗持有者{
复选框;
}
@凌驾
公共视图getView(最终整型位置,视图转换视图,
视图组(父级){
Log.d(“getView”、“getView”);
if(convertView==null){
convertView=充气机。充气(R.layout.activity\u orderitem,
无效);
viewHolder=新的viewHolder();
//缓存视图
convertView.setTag(viewHolder);
}否则
viewHolder=(viewHolder)convertView.getTag();
viewHolder.checkBox.setChecked(checkBoxState[position]);
viewHolder.checkBox.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
如果(((复选框)v).isChecked()){
checkBoxState[位置]=真;
}否则{
checkBoxState[位置]=假;
}
}
});
返回视图;
}
}
}

在我看来,您正在使用视图来存储其状态,因此当视图在滚动中循环时,原始元素将丢失状态,甚至可以将状态分配给获得循环视图的其他元素。
尝试将元素的状态存储在适配器的不同结构中,而不是存储在视图中。

这是做什么的?:<代码>FilmRequestActivity.ButtonClickFunction(上下文,(按钮)v)你能发布这个方法的代码吗?Vikram我已经更新了它。更好的方法是使用ButtonClickFunction更改数据并调用notifyDataSetChanged Sudar,但我认为我需要重新加载数据以调用notifyDataSetChanged。但我正在从网站加载数据。需要2-3秒。我不能让用户等待每次按钮的点击。我想我的问题不在于getTag和setTag。按钮自动填充。所以我不能用settag.Akram管理每个按钮,我认为他根本没有使用这个模式。
    if (convertView == null) {
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }   
    final FilmRequest filmRequest = (FilmRequest)data.get(position);
    String status = filmRequest.status;
    boolean requested = filmRequest.requested;
    boolean voted = filmRequest.voted;
public class CustomizeListView extends ListActivity {

    LayoutInflater inflater;
    static int index = 0;

    // AutoCompleteTextView autoCompleteTextView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_order);
        inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, arrayList_Category);
        dataAdapter
                .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        final CustomAdapter adapter = new CustomAdapter(this,
                R.layout.activity_orderitem, arrayListItems);
        setListAdapter(adapter);
    }

    private class CustomAdapter extends ArrayAdapter<HashMap<String, Object>>
            implements OnItemSelectedListener {
        boolean[] checkBoxState;
        ViewHolder viewHolder;

        public CustomAdapter(Context context, int textViewResourceId,
                ArrayList<HashMap<String, Object>> arrayListItems) {
            // let android do the initializing :)
            super(context, textViewResourceId, arrayListItems);
            checkBoxState = new boolean[arrayListItems.size()];
        }

        // class for caching the views in a row
        private class ViewHolder {
            CheckBox checkBox;
        }

        @Override
        public View getView(final int position, View convertView,
                ViewGroup parent) {
            Log.d("getView", "getView");
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.activity_orderitem,
                        null);
                viewHolder = new ViewHolder();
                // cache the views
                convertView.setTag(viewHolder);
            } else
                viewHolder = (ViewHolder) convertView.getTag();

            viewHolder.checkBox.setChecked(checkBoxState[position]);

            viewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    if (((CheckBox) v).isChecked()) {
                        checkBoxState[position] = true;
                    } else {
                        checkBoxState[position] = false;
                    }
                }
            });

            return convertView;
        }
    }
}