过滤ListView后如何保持旧数组索引位置

时间:2014-05-03 19:49:00

标签: android arrays listview android-listview filter

我在MainActiviy上有EditTextListViewEditText用于搜索和过滤ListView项。

我有两个阵列;

报纸[]拥有一些报纸名称,

地址[]持有报纸的网址。

我也有setOnItemClickListener。在监听器中,我得到项目的位置,并借助于此索引号的数组,我从adress[ ]数组中获取地址信息。

首先没有过滤器的搜索框。我在EditText中添加了addTextChangedListener来过滤ListView的项目。问题从这里开始了!

当我在搜索框中写入内容时,它会正确过滤,但过滤后如果我点击任何项目,则会打开旧项目的地址。

示例:

假设,

A

C

d

是过滤前的项目,数组位置的项目是0,B = 1,C = 2,D = 3

如果我写信给搜索" C"过滤后只有C可见,如果我点击" C"项目它打开了网站。因为" A" item是过滤前的第一项。

如何在过滤ListView后更新数组索引位置?

public class MainActivity extends Activity {

// Search EditText
EditText inputSearch;

// Listview Adapter
ArrayAdapter<String> adapter;

protected static final String SITE_ADDRESS = null;
// protected static final String SITE_NAME = null;

private ListView newspaper_list_view;

private String[] newspapers = { "A","B","C","D" };

private String[] adress = { "a.com","b.com","c.com","d.com" };

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // setContentView(R.layout.webview);

    inputSearch = (EditText) findViewById(R.id.inputSearch);

    newspaper_list_view = (ListView) findViewById(R.id.gazeteliste);
    adapter             = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, newspapers);
    newspaper_list_view.setAdapter(adapter);

    final Intent intent = new Intent(this, GazeteIcerik.class);

    newspaper_list_view.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> arg0, View arg1,
                int listposition, long arg3) {

            // Toast.makeText(getApplicationContext(),"Liste Sırası:" +
            // listposition, Toast.LENGTH_SHORT).show();

            String site_adress = adress[listposition];
            String site_name   = newspapers[listposition];

            intent.putExtra(SITE_ADDRESS, site_adress);
            // intent.putExtra(SITE_NAME, site_name);
            getActionBar().setDisplayHomeAsUpEnabled(true);
            intent.putExtra(SITE_ADDRESS, new String[] { site_adress,site_name });
            startActivity(intent);
        }
    });

    inputSearch.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence cs, int arg1, int arg2,int arg3) {
            // When user changed the Text
            MainActivity.this.adapter.getFilter().filter(cs);
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1,int arg2, int arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub
        }
    });

}

// onCreate sonu

}

1 个答案:

答案 0 :(得分:0)

您为报纸和地址使用了两个独立的数组,这就是问题的原因。目前,您只是过滤报纸数组,但地址数组保持不变。这就是为什么你要获得旧物品的地址。你可以采取两种不同的方法来解决这个问题。

  1. (简单)为地址创建哈希映射,并使用报纸名称作为键和地址作为值,这样您就可以获得正确的地址。
  2. 公共类MainActivity扩展了Activity {

      HashMap<String, String> addressMap = new HashMap<String, String>(); // initialize the hashmap
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {   
        newspaper_list_view.setOnItemClickListener(new OnItemClickListener() {
           public void onItemClick(AdapterView<?> arg0, View arg1, int listposition, long arg3) {
              String name   = newspapers[listposition];
              String address = addressMap.get(name);
           }
        });
      }
    }
    
    1. (更复杂,只有在您需要为listview添加更多功能时才选择)或者您可以创建一个存储报纸和地址的自定义对象以及一个自定义适配器来过滤列表视图。