【问题标题】:Android get proper info from listView onClickAndroid 从 listView onClick 获取正确的信息
【发布时间】:2013-01-09 04:38:45
【问题描述】:

所以我有一个从 Web 提供的 xml 文件填充的 ListView。该列表填充良好。好吧,它使用了一种糟糕的填充方法,我知道它应该使用 AsyncTask 但它会填充在 UI 线程上。我尝试过使用 AsyncTask,但我输了!我知道我知道!!如果您对此有解决方案,我很乐意听到它! 无论如何,当单击列表项时,我会开始一个新活动并使用 intent.putExtra 传递信息 这有效,但它总是显示列表中第一项的信息。 示例:

一个

B

C

D

E

是列表中的项目。在以下活动中按下其中任何一个都会给我与 A 相关的所有信息 我该如何解决这个问题???

ListView 活动:

    public class ColorPacksMain extends Activity {
// All static variables
static final String URL = "https://dl.dropbox.com/u/43058382/BeanPickerColorToolUpdates/ColorPacksList.xml";
// XML node keys
static final String KEY_COLORPACK = "ColorPack"; // parent node
static final String KEY_ID = "id";
static final String KEY_USER = "user";
static final String KEY_THEME = "theme";
static final String KEY_THEMECOLOR = "themeColor";
static final String KEY_TEXTCOLORPRIMARY = "primaryTextColor";
static final String KEY_TEXTCOLORSECONDARY = "secondaryTextColor";
static final String KEY_THUMB_URL = "thumb_url";
static final String KEY_DL_URL_GSM = "dl_url_gsm";
static final String KEY_DL_URL_LTE = "dl_url_lte";
static final String KEY_SCREEN1 = "screen1";
static final String KEY_SCREEN2 = "screen2";
static final String KEY_SCREEN3 = "screen3";
static final String KEY_SCREEN4 = "screen4";

ListView list;
LazyAdapter adapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.color_packs_activity);

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

    StrictMode.setThreadPolicy(policy);


    ArrayList<HashMap<String, String>> colorPacksList = new ArrayList<HashMap<String, String>>();

    XMLParser parser = new XMLParser();
    String xml = parser.getXmlFromUrl(URL); // getting XML from URL
    Document doc = parser.getDomElement(xml); // getting DOM element

    NodeList nl = doc.getElementsByTagName(KEY_COLORPACK);
    // looping through all song nodes <song>
    for (int i = 0; i < nl.getLength(); i++) {
        // creating new HashMap
        HashMap<String, String> map = new HashMap<String, String>();
        Element e = (Element) nl.item(i);
        // adding each child node to HashMap key => value
        map.put(KEY_ID, parser.getValue(e, KEY_ID));
        map.put(KEY_USER, parser.getValue(e, KEY_USER));
        map.put(KEY_THEME, parser.getValue(e, KEY_THEME));
        map.put(KEY_THEMECOLOR, parser.getValue(e, KEY_THEMECOLOR));
        map.put(KEY_TEXTCOLORPRIMARY, parser.getValue(e, KEY_TEXTCOLORPRIMARY));
        map.put(KEY_TEXTCOLORSECONDARY, parser.getValue(e, KEY_TEXTCOLORSECONDARY));
        map.put(KEY_DL_URL_GSM, parser.getValue(e, KEY_DL_URL_GSM));
        map.put(KEY_DL_URL_LTE, parser.getValue(e, KEY_DL_URL_LTE));
        map.put(KEY_SCREEN1, parser.getValue(e, KEY_SCREEN1));
        map.put(KEY_SCREEN2, parser.getValue(e, KEY_SCREEN2));
        map.put(KEY_SCREEN3, parser.getValue(e, KEY_SCREEN3));
        map.put(KEY_SCREEN4, parser.getValue(e, KEY_SCREEN4));
        map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL));

        // adding HashList to ArrayList
        colorPacksList.add(map);
    }


    list = (ListView) findViewById(R.id.colorPacksList);

    // Getting adapter by passing xml data ArrayList
    adapter=new LazyAdapter(this, colorPacksList);        
    list.setAdapter(adapter);


    // Click event for single list row
    list.setOnItemClickListener(new OnItemClickListener() {


        @Override

        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
              // Launching new Activity on selecting single List Item
              Intent i = new Intent(getApplicationContext(), ListClickedItem.class);
              // sending data to new activity
              String user = ((TextView) findViewById(R.id.user)).getText().toString();
              String theme = ((TextView) findViewById(R.id.theme)).getText().toString();
              String themeColor = ((TextView) findViewById(R.id.themeColor)).getText().toString();
              String tcP = ((TextView) findViewById(R.id.primaryTextColor)).getText().toString();
              String tcS = ((TextView) findViewById(R.id.secondaryTextColor)).getText().toString();
              String dlGSM = ((TextView) findViewById(R.id.GSMurl)).getText().toString();
              String dlLTE = ((TextView) findViewById(R.id.LTEurl)).getText().toString();
              String screen1 = ((TextView) findViewById(R.id.screen1url)).getText().toString();
              String screen2 = ((TextView) findViewById(R.id.screen2url)).getText().toString();
              String screen3 = ((TextView) findViewById(R.id.screen3url)).getText().toString();
              String screen4 = ((TextView) findViewById(R.id.screen4url)).getText().toString();
              i.putExtra("UserName", user);
              i.putExtra("ThemeName", theme);
              i.putExtra("ThemeColor", themeColor);
              i.putExtra("TextColorPrimary", tcP);
              i.putExtra("TextColorSecondary", tcS);
              i.putExtra("GSM", dlGSM);
              i.putExtra("LTE", dlLTE);
              i.putExtra("Screenshot 1", screen1);
              i.putExtra("Screenshot 2", screen2);
              i.putExtra("Screenshot 3", screen3);
              i.putExtra("Screenshot 4", screen4);
              startActivity(i);

        }
    });     
}   

item被点击后显示的Activity:

    public class ListClickedItem extends Activity{
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.list_clicked_activity);


    TextView txtUser = (TextView) findViewById(R.id.userName);
    TextView txtTheme = (TextView) findViewById(R.id.themeName);
    TextView txtThemeColor = (TextView) findViewById(R.id.themeColor);
    TextView txtColor1 = (TextView) findViewById(R.id.textColor1);
    TextView txtColor2 = (TextView) findViewById(R.id.textColor2);
    TextView txtLTEurl = (TextView) findViewById(R.id.lteUrl);
    TextView txtGSMurl = (TextView) findViewById(R.id.gsmUrl);

    ImageView screenShot1 = (ImageView) findViewById(R.id.screen1);
    ImageView screenShot2 = (ImageView) findViewById(R.id.screen2);
    ImageView screenShot3 = (ImageView) findViewById(R.id.screen3);
    ImageView screenShot4 = (ImageView) findViewById(R.id.screen4);

    Bundle extras = getIntent().getExtras();
    if(extras!=null){
        String user=extras.getString("UserName");
        String themeName=extras.getString("ThemeName");
        String themeColor=extras.getString("ThemeColor");
        String tcPrimary=extras.getString("TextColorPrimary");
        String tcSecondary=extras.getString("TextColorSecondary");
        String linkGsm=extras.getString("GSM");
        String linkLte=extras.getString("LTE");
        String screen1=extras.getString("Screenshot 1");
        String screen2=extras.getString("Screenshot 2");
        String screen3=extras.getString("Screenshot 3");
        String screen4=extras.getString("Screenshot 4");

        txtUser.setText("User Name: " + user);
        txtTheme.setText("Theme Name: " + themeName);
        txtThemeColor.setText("Theme Color: " + themeColor);
        txtColor1.setText("Primary Text Color: " + tcPrimary);
        txtColor2.setText("Secondary Text Color: " + tcSecondary);
        txtLTEurl.setText(linkLte);
        txtGSMurl.setText(linkGsm);

        Drawable s1;
        try {
            InputStream is = (InputStream) new URL(screen1).getContent();
            s1 = Drawable.createFromStream(is, "src name");
            screenShot1.setBackgroundDrawable(s1);
        } catch (Exception e) {

        }

        Drawable s2;
        try {
            InputStream is = (InputStream) new URL(screen2).getContent();
            s2 = Drawable.createFromStream(is, "src name");
            screenShot2.setBackgroundDrawable(s2);
        } catch (Exception e) {

        }

        Drawable s3;
        try {
            InputStream is = (InputStream) new URL(screen3).getContent();
            s3 = Drawable.createFromStream(is, "src name");
            screenShot3.setBackgroundDrawable(s3);
        } catch (Exception e) {

        }

        Drawable s4;
        try {
            InputStream is = (InputStream) new URL(screen4).getContent();
            s4 = Drawable.createFromStream(is, "src name");
            screenShot4.setBackgroundDrawable(s4);
        } catch (Exception e) {

        }

    }

}

还有,我的 Adapter 类,因为我知道它会被要求:

    public class LazyAdapter extends BaseAdapter {

private Activity activity;
private ArrayList<HashMap<String, String>> data;
private static LayoutInflater inflater=null;
public ImageLoader imageLoader; 

public LazyAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
    activity = a;
    data=d;
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    imageLoader=new ImageLoader(activity.getApplicationContext());
}

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

public Object getItem(int position) {
    return position;
}

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

public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    if(convertView==null)
        vi = inflater.inflate(R.layout.list_row, null);

    TextView user = (TextView)vi.findViewById(R.id.user); // username
    TextView theme = (TextView)vi.findViewById(R.id.theme); // theme name
    TextView themeColor = (TextView)vi.findViewById(R.id.themeColor); // theme color
    TextView primaryTextColor = (TextView)vi.findViewById(R.id.primaryTextColor); // main text color
    TextView secondaryTextColor = (TextView)vi.findViewById(R.id.secondaryTextColor); // secondary text color
    TextView gsmURL = (TextView)vi.findViewById(R.id.GSMurl); // Maguro URL
    TextView lteURL = (TextView)vi.findViewById(R.id.LTEurl); // Toro/ToroPlus URL
    TextView screenShot1 = (TextView)vi.findViewById(R.id.screen1url); // Screenshot url
    TextView screenShot2 = (TextView)vi.findViewById(R.id.screen2url); // Screenshot url
    TextView screenShot3 = (TextView)vi.findViewById(R.id.screen3url); // Screenshot url
    TextView screenShot4 = (TextView)vi.findViewById(R.id.screen4url); // Screenshot url
    ImageView thumb_image=(ImageView)vi.findViewById(R.id.list_image); // thumb image

    HashMap<String, String> colorPack = new HashMap<String, String>();
    colorPack = data.get(position);

    // Setting all values in listview
    user.setText(colorPack.get(ColorPacksMain.KEY_USER));
    theme.setText(colorPack.get(ColorPacksMain.KEY_THEME));
    themeColor.setText(colorPack.get(ColorPacksMain.KEY_THEMECOLOR));
    primaryTextColor.setText(colorPack.get(ColorPacksMain.KEY_TEXTCOLORPRIMARY));
    secondaryTextColor.setText(colorPack.get(ColorPacksMain.KEY_TEXTCOLORSECONDARY));
    gsmURL.setText(colorPack.get(ColorPacksMain.KEY_DL_URL_GSM));
    lteURL.setText(colorPack.get(ColorPacksMain.KEY_DL_URL_LTE));
    screenShot1.setText(colorPack.get(ColorPacksMain.KEY_SCREEN1));
    screenShot2.setText(colorPack.get(ColorPacksMain.KEY_SCREEN2));
    screenShot3.setText(colorPack.get(ColorPacksMain.KEY_SCREEN3));
    screenShot4.setText(colorPack.get(ColorPacksMain.KEY_SCREEN4));
    imageLoader.DisplayImage(colorPack.get(ColorPacksMain.KEY_THUMB_URL), thumb_image);
    return vi;
}

非常感谢任何帮助!

【问题讨论】:

    标签: android listview onitemclick


    【解决方案1】:

    在每一行中写入 view.findViewById。就像下面一样。

     public void onItemClick(AdapterView<?> arg0, View view, int arg2,
                long arg3) {
              // Launching new Activity on selecting single List Item
              Intent i = new Intent(getApplicationContext(), ListClickedItem.class);
    
              // sending data to new activity
    
              String user = ((TextView) view.findViewById(R.id.user)).getText().toString();
              String theme = ((TextView) view.findViewById(R.id.theme)).getText().toString();
    
              startActivity(i);
    
        }
    

    【讨论】:

    • 你更新了这一行吗? public void onItemClick(AdapterView> arg0, View view, int arg2, long arg3) 我已将 View arg1 更改为 View view。
    • 我没有,很抱歉我才意识到我没有添加额外的 () 集
    • 做到了!它总是小事!!你是最好的人,完全知道发生了什么!我会将您标记为已回答!
    【解决方案2】:

    您正在通过i.putExtra("UserName", user); 向意图填充数据,但您通过extras.getString("UserName"); 等附加功能获取数据

    相反,您会在 ListClickedItem 活动中获得如下值。

    String user = getIntent().getStringExtra("UserName");
    

    getExtras() 最有可能在您使用 Bundle 填充数据并在其他活动中获取数据时使用。希望这会有所帮助。

    注意:除了上面的更正,正如你所说你知道你应该使用异步任务,我可以建议你再做一件事——当你使用异步任务时,在获取所需的数据之后从您的doInBackground() 方法中的Web 服务,您应该将数据填充到onPostExecute() 方法中的列表视图中。您可以使用runOnUIThread() 来填充 onPostExecute() 方法中的数据,甚至可以在此方法本身中将onClickListener 设置为列表视图。

    【讨论】:

    • 我尝试像您的示例一样检索值,但我仍然从列表中的所有其他项目中获取 #1 的数据。另外,我会听取你对异步任务的建议,好消息!谢谢
    • 不客气。我只是建议您进行数据传输,但没有检查您的 onClick()。很高兴您的问题在其他回答者的帮助下得到了解决。
    • 这里我们进行第 2 轮,将我的工作活动转换为异步任务并让它在一周内无法工作......我可能会回来获取一些信息 :)
    【解决方案3】:
    use an AsyncTask but instead it populates on the UI thread. I tried and tried with an AsyncTask, but I lost the fight!
    

    使用 Arraylists 而不是 hashmap。我已经使用了 Arraylist 并在 asyncTask 中添加了元素。

    public class Home extends Activity {
    /** Called when the activity is first created. */
    static final String URL = "https://dl.dropbox.com/u/43058382/BeanPickerColorToolUpdates/ColorPacksList.xml";
    
    static final String KEY_ITEM = "Book"; // parent node
    static final String KEY_BOOKAUTHOR = "book_author";
    static final String KEY_BOOKRATING = "BookRating";
    static final String KEY_BOOKID = "BookID";
    static final String KEY_BOOKDESC = "BookDescription";
    static final String KEY_BOOKDATEPUBLISHED = "DatePublished";
    static final String KEY_BOOKTITLE = "BookTitle";
    static final String KEY_BOOKCODE = "BookCode";
    
        static ArrayList<String> BookTitle = null;
    static ArrayList<Integer> BookRating = null;
    static ArrayList<String> BookDescription = null;
    static ArrayList<String> BookCoverPhotos = null;
    static ArrayList<String> BookAuther = null;
    
        ConnectivityManager cm;
    
        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
    
        cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    
        // First Check the Internet Connectivity
        if (cm.getActiveNetworkInfo() != null
                    && cm.getActiveNetworkInfo().isAvailable()
                    && cm.getActiveNetworkInfo().isConnected()) {
                // Avoid to reload the page again and again
                if (BookTitle == null) {
                    BookTitle = new ArrayList<String>();
                    BookRating = new ArrayList<Integer>();
                    BookDescription = new ArrayList<String>();
                    BookIDs = new ArrayList<String>();
                    BookCode = new ArrayList<String>();
                    BookCoverPhotos = new ArrayList<String>();
                    BookAuther = new ArrayList<String>();
    
                                        // Execute the AsyncTask
                    new myBackGroundTask().execute(URL);
                } else {
    
                    ImageAdapter adapter2 = new ImageAdapter(getBaseContext(),
                            act);
                    adapter2.notifyDataSetChanged();
                    gridView.setAdapter(adapter2);
                                 }
    

    这里是显示我们如何在后台解析 XML 的 asyncTask

    private class myAsyncTask extends AsyncTask<String, Integer, String> {
    
        ProgressDialog progressDialog;
        ImageAdapter adapter = new ImageAdapter(getBaseContext(), act);
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog = ProgressDialog.show(getParent(),
                    "Your Title ...",
                    "This may Take a few seconds.\nPlease Wait...");
    
        }
    
        @Override
        protected String doInBackground(String... params) {
    
            String URL = params[0];
            XMLParser parser = new XMLParser();
            String XMLString = null;
            XMLString = parser.getXmlFromUrl_FeaturedBooks(URL, lIndex);
    
            if (XMLString != null) {
    
                Document doc = parser.getDomElement(XMLString);
                NodeList nl = doc.getElementsByTagName(KEY_ITEM);
    
                // looping through all item nodes <item>
    
                for (int i = 0; i < nl.getLength(); i++) {
    
                    Element e = (Element) nl.item(i);
    
                    try {
                        BookRating.add(Integer.valueOf(parser.getValue(e,
                                KEY_BOOKRATING)));
    
                    } catch (Exception e2) {
                        BookRating.add(0);
                    }
    
                    BookDescription.add(parser.getValue(e, KEY_BOOKDESC));
                    BookTitle.add(parser.getValue(e, KEY_BOOKTITLE));
                    BookCoverPhotos
                            .add("http://shiaislamicbooks.com/books_Snaps/"
                                    + parser.getValue(e, KEY_BOOKCODE)
                                    + "/1_thumb.jpg");
                    int tempCount = BookCoverPhotos.size() - 1;
                    BookAuther.add(parser.getValue(e, KEY_BOOKAUTHOR));
    
                    publishProgress(i + 1);
                }
    
            } else {
                                // Request Time
                publishProgress(5000);
            }
    
            return null;
        }
    
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            progressDialog.setMessage(values[0]
                    + " Book(s) found \nPlease wait...");
            adapter.notifyDataSetChanged();
            if (values[0] == 5000) {
                Toast.makeText(context,
                        "Rrequest Time out!\nNo or Slow Internet Connection!",
                        Toast.LENGTH_LONG).show();
            }
        }
    
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            progressDialog.dismiss();
            adapter.notifyDataSetChanged();
            gridView.setAdapter(adapter);
    
        }
    }
    

    编辑

    这是扩展 BaseAdapter 类的 imageAdapter

    public class ImageAdapter extends BaseAdapter {
    
        public ImageAdapter(Context c) {
            context = c;
    
        }
    
        // ---returns the number of images---
        public int getCount() {
    
            return BookTitle.size();
    
        }
    
        public ImageAdapter(Context ctx, Activity act) {
    
            inflater = (LayoutInflater) act
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
        }
    
        // ---returns the ID of an item---
        public Object getItem(int position) {
            return position;
        }
    
        public long getItemId(int position) {
            return position;
        }
    
        // ---returns an ImageView view---
        public View getView(int position, View convertView, ViewGroup parent) {
    
            // ImageView bmImage;
    
            final ViewHolder holder;
            View vi = convertView;
            if (convertView == null) {
                vi = inflater.inflate(R.layout.grid_style, parent, false);
                holder = new ViewHolder();
                holder.txt_BooksTitle = (TextView) vi
                        .findViewById(R.id.txt_BookTitle);
    
                holder.img_BookCoverPhoto = (ImageView) vi
                        .findViewById(R.id.imgBookCover);
                vi.setTag(holder);
            } else {
    
                holder = (ViewHolder) vi.getTag();
            }
            holder.txt_BooksTitle.setText(BookTitle.get(position) + "");
            holder.img_BookCoverPhoto.setImageBitmap(bitmapArray.get(position));
            return vi;
        }
    }
    
    class ViewHolder {
        TextView txt_BooksTitle;
        ImageView img_BookCoverPhoto;
    }
    

    【讨论】:

    • 告诉我它对你有帮助吗?
    • 不,它没有帮助..我一直在尝试,但它根本行不通...你能用我的代码做一个例子吗?
    • 用简洁的语言发布一个新问题。我会让你帮忙
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多