【问题标题】:How can I stop update listview when is scrolling?滚动时如何停止更新列表视图?
【发布时间】:2016-02-18 12:44:59
【问题描述】:

我的 BaseAdapter 工作正常,但是当我滚动列表视图时,每个项目都是双精度的。我不知道如何才能阻止它。

下面是来自 PHP 服务器的数组。 PHP 服务器将此作为 json 字符串发送。

Array
(
    [0] => Array
        (
            [i] => 122:133:155:201:159:113:153:202:220:222:221:225:109
            [j] => 8
            [r] => 9a
        )

    [1] => Array
        (
            [i] => 205:182:221
            [j] => 9
            [r] => 10
        )

    [2] => Array
        (
            [i] => 
            [j] => 10
            [r] => 11
        )

    [3] => Array
        (
            [i] => 101:102:132
            [j] => 12
            [r] => 13
        )

)

这是活动:

public class Strefa extends Activity {

    AdapterStrefa mListAdapter;

    ListView listview;
    ArrayList<ListData> myList = new ArrayList<>();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if(GlobalConfig.tryb) {
            setTheme(R.style.AppTheme_Dark);
            setContentView(R.layout.n_strefa);
        } else {
            //setContentView(R.layout.d_statystyki);
        }

        GlobalConfig config = new GlobalConfig();
        JSONArray JsonArray = config.getJsonArray();

        for (int i = 0; i < JsonArray.length(); i++) {

            try {
                JSONObject jsonObject = JsonArray.getJSONObject(i);

                int r = jsonObject.getInt("j");

                ListData ld = new ListData();
                ld.setAdres(jsonObject.getString("i"));
                ld.setStrefa(jsonObject.getString("r") + ":");
                myList.add(ld);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        listview = (ListView) findViewById(R.id.listView);

        mListAdapter = new AdapterStrefa(this, myList);
        listview.setAdapter(mListAdapter);

        /* Powrót */

        Button Back = (Button) findViewById(R.id.back);

        Back.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                finish();

            }
        });

    }

}

这是我的 BaseAdaper:

public class AdapterStrefa extends BaseAdapter {

    ArrayList myList = new ArrayList();
    LayoutInflater inflater;
    Context context;


    public AdapterStrefa(Context context, ArrayList myList) {
        this.myList = myList;
        this.context = context;
        inflater = LayoutInflater.from(this.context);
    }

    @Override
    public int getCount() {
        return myList.size();
    }

    @Override
    public ListData getItem(int position) {
        return (ListData) myList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

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

        MyViewHolder mViewHolder;

        if(convertView == null) {

            if(GlobalConfig.tryb) {
                convertView = inflater.inflate(R.layout.n_strefa_item, parent, false);
            } else {
                convertView = inflater.inflate(R.layout.d_zlecenia_lista, parent, false);
            }

            mViewHolder = new MyViewHolder(convertView);
            convertView.setTag(mViewHolder);

        }else {

            mViewHolder = (MyViewHolder) convertView.getTag();

        }


        ListData currentListData = getItem(position);

        mViewHolder.strefa.setText(currentListData.getStrefa());
        mViewHolder.dzielnica.setText(currentListData.getDzielnica());
        //mViewHolder.layout.setText(currentListData.getAdres());


        String CurrentString = currentListData.getAdres();
        String[] separated = CurrentString.split(":");

        for(int i = 0; i < separated.length; i++) {

            if(!separated[i].isEmpty()) {
                Button button = new Button(context, null, android.R.attr.buttonStyleSmall);
                button.setText(context.getString(R.string.string, separated[i]));
                mViewHolder.layout.addView(button);
            }
        }

        return convertView;
    }

    private class MyViewHolder {
        TextView strefa, dzielnica;
        LinearLayout layout;

        public MyViewHolder(View item) {
            strefa = (TextView) item.findViewById(R.id.strefa);
            dzielnica = (TextView) item.findViewById(R.id.dzielnica);
            layout = (LinearLayout) item.findViewById(R.id.layout);
        }
    }
}

我希望每个项目都从 json 字符串创建按钮。例如当数组 json 的第一个元素有一个字符串:205:182:221 时,必须在 item 中创建三个按钮。当我滚动列表视图时,每个项目都是双倍的。我怎样才能停止双倍?

【问题讨论】:

  • 你说的每一项都是双份是什么意思?另外请在您解析 JSON 和创建适配器的位置发布代码。
  • 我的 BaseAdapter 创建了三个按钮,如果 jsonarray 的第一个元素有字符串,这非常好:205:182:221 但是当我滚动我的列表视图时,每个项目都会复制数据,所以第一个元素有六个按钮,九等。每当我隐藏列表视图项目然后在滚动时可见时,就会发生这种情况。
  • 请看看我的回答是否适合你。

标签: android listview baseadapter listviewitem viewgroup


【解决方案1】:

添加

mViewHolder.layout.removeAllViews();

就在getView() 方法内的for 循环之前。

【讨论】:

  • 太棒了!但为什么我的其他列表视图没有复制?在其他适配器中,我只使用 addView() mViewHolder.XXX.setText(currentListData.getXXX());有没有影响?
  • 如果你不使用addView 就可以了。
  • 好的,但我必须动态创建元素。您知道更好的解决方案吗?
  • 我没有发现你的做法有什么问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
相关资源
最近更新 更多