【问题标题】:Searchbar Changing Positions due to filtering搜索栏因过滤而改变位置
【发布时间】:2013-12-27 13:54:08
【问题描述】:

我一直在从事一个项目,其中我有一个主要活动,其中我有列表视图和一个搜索栏(编辑文本栏),并且我的列表视图的 onitemclicklistener 将行位置传递给具有 webview 和 webview 的活动将 html 页面打开到各自的位置。我的 listview 项目也存储在 arrays.xml 中

我的问题从这里开始 - 我的 Listview Works 文件并在行单击时打开相应的活动(当我不使用搜索栏而只是滚动并单击行时。)

但是当我使用搜索栏搜索一个项目(html 页面)时,例如让它为“c”并单击它,列表视图不会打开正确的 html 页面!。希望这很清楚。我有大约数千个 html 文件,因此由于堆大小有限,无法存储 java 文件中的所有位置。我在这里找到了一种解决方案After filter a listview,how can I obtain the position of the first listview? 但我不知道如何在我的代码中实现这一点。

    here is my main activity

package com.Sample.htmlOpener;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;

public class MainActivity extends Activity {
private ListView list1;
private String array[] ;
EditText inputSearch; 
ArrayAdapter<String> adapter;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
inputSearch = (EditText) findViewById(R.id.inputSearch); 
list1 = (ListView) findViewById(R.id.ListView01);
array = getResources().getStringArray(R.array.myArray);
adapter =new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, array);
list1.setAdapter(adapter);
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                          
 }
 });

list1.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
    int position, long id) {
    Intent myIntent = new Intent(MainActivity.this,WebViewActivity.class);
    myIntent.putExtra("key",position);
    startActivity(myIntent);
 }
 });   
}

}

这是我的 webview 活动

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;


public class WebViewActivity extends Activity {
WebView web;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_web_view);
    web = (WebView) findViewById(R.id.webView1);
    web.setWebViewClient(new myWebClient());
    web.getSettings().setJavaScriptEnabled(true);
    int pos = getIntent().getIntExtra("key",0);
    if(pos==0)
    {
        web.loadUrl("file:///android_asset/file.html");
    }
    else
    {
        web.loadUrl("file:///android_asset/file" + pos + ".html");
    }
  // similarly for 4 and 5 and so on.
 }

 public class myWebClient extends WebViewClient
 {
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        // TODO Auto-generated method stub
        super.onPageStarted(view, url, favicon);
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // TODO Auto-generated method stub

        view.loadUrl(url);
        return true;

    }
    @Override
    public void onReceivedError(WebView view, int errorCode,
            String description, String failingUrl) {
    }
    @Override
    public void onPageFinished(WebView view, String url) {
        // TODO Auto-generated method stub
        super.onPageFinished(view, url);

    }
 }
}  

【问题讨论】:

    标签: android listview android-listview webview


    【解决方案1】:
    public class MainActivity extends Activity {
    
        // List view
        private ListView lv;
    
        // Listview Adapter
        ArrayAdapter<String> adapter;
    
        // Search EditText
        EditText inputSearch;
    
    
        String[] productsList;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            productsList = getResources().getStringArray(R.array.list);
    
    
            lv = (ListView) findViewById(R.id.list_view);
            inputSearch = (EditText) findViewById(R.id.inputSearch);
    
            // Adding items to listview
            adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.product_name, getResources().getStringArray(R.array.list));
            lv.setAdapter(adapter);
    
            /**
             * Enabling Search Filter
             * */
            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                          
                }
            });
    
            lv.setOnItemClickListener(new OnItemClickListener() {
    
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    
                    String productName = adapter.getItem(position);
    
                    for ( int i=0;i<productsList.length;i++){
    
                        String product = productsList[i];
    
                        if ( product.equals(productName)){
                            Toast.makeText(MainActivity.this, "Original Position of Item in  listview "+i, Toast.LENGTH_SHORT).show();
                            break;
                        }                   
                   }
                }
    
            });
        }
    
    }
    

    见:http://www.androidhive.info/2012/09/android-adding-search-functionality-to-listview/

    【讨论】:

    • 我告诉过你我有上千个html文件,请仔细阅读描述
    • 我的 listview 项目在 listarrays.xml 中,我不会一次又一次地编写它们,请修改您的代码
    • 现在检查我更新的答案,它使用来自 xml 的数组
    • 这不起作用,请检查有问题的代码,我想将项目位置传递给另一个活动,请查看两个代码,
    【解决方案2】:

    正如您所说,您有数千个项目,因此检查匹配项不是一个好选择。您可以做的是,您可以创建一个自定义列表适配器并为每个项目设置一个标签。在列表视图的 onclick 中,您可以获得该标签并使用它。

    【讨论】:

      猜你喜欢
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多