2015-01-21 31 views
0

我为我的Android应用程序创建了一个ListView,并且为项目的单独部分创建单独的onClickListeners时出现问题。我的项目有一个image1,image2和一个文本。我想要的是根据哪些被点击而开始不同的活动。以下是我的代码。如何在Android中为列表视图项目的单独组件(部件)启动一项新活动

**MainActivity.java** 
public class MainActivity extends Activity { 
    ListView mListView; 
    ImageView rightarrow; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     // URL to the JSON data   
     String strUrl = "url of php file"; 

     // Creating a new non-ui thread task to download json data 
     DownloadTask downloadTask = new DownloadTask(); 

     // Starting the download process 
     downloadTask.execute(strUrl); 
    } 


    /** A method to download json data from url */ 
    private String downloadUrl(String strUrl) throws IOException{ 
     String data = ""; 
     InputStream iStream = null; 
     try{ 
       URL url = new URL(strUrl); 

       // Creating an http connection to communicate with url 
       HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 

       // Connecting to url 
       urlConnection.connect(); 

       // Reading data from url 
       iStream = urlConnection.getInputStream(); 

       BufferedReader br = new BufferedReader(new InputStreamReader(iStream)); 

       StringBuffer sb = new StringBuffer(); 

       String line = ""; 
       while((line = br.readLine()) != null){ 
        sb.append(line); 
       } 

       data = sb.toString(); 

       br.close(); 

     }catch(Exception e){ 
       Log.d("Exception while downloading url", e.toString()); 
     }finally{ 
       iStream.close(); 
     } 

     return data; 
    } 





/** AsyncTask to download json data */ 
     private class DownloadTask extends AsyncTask<String, Integer, String>{ 
      String data = null; 
        @Override 
        protected String doInBackground(String... url) { 
          try{ 
           data = downloadUrl(url[0]); 

          }catch(Exception e){ 
           Log.d("Background Task",e.toString()); 
          } 
          return data; 
        } 

        @Override 
        protected void onPostExecute(String result) { 

          // The parsing of the xml data is done in a non-ui thread 
          ListViewLoaderTask listViewLoaderTask = new ListViewLoaderTask(); 

          // Start parsing xml data 
          listViewLoaderTask.execute(result);       

        } 
     } 



/** AsyncTask to parse json data and load ListView */ 
     private class ListViewLoaderTask extends AsyncTask<String, Void, SimpleAdapter>{ 

      JSONObject jObject; 
      // Doing the parsing of xml data in a non-ui thread 
      @Override 
      protected SimpleAdapter doInBackground(String... strJson) { 
       try{ 
        jObject = new JSONObject(strJson[0]); 
        CountryJSONParser countryJsonParser = new CountryJSONParser(); 
        countryJsonParser.parse(jObject); 
       }catch(Exception e){ 
        Log.d("JSON Exception1",e.toString()); 
       } 

       // Instantiating json parser class 
       CountryJSONParser countryJsonParser = new CountryJSONParser(); 

       // A list object to store the parsed countries list 
       List<HashMap<String, Object>> countries = null; 

       try{ 
        // Getting the parsed data as a List construct 
        countries = countryJsonParser.parse(jObject); 
       }catch(Exception e){ 
        Log.d("Exception",e.toString()); 
       }   

       // Keys used in Hashmap 
       // String[] from = { "country","flag","details"}; 
       String[] from = {"flag"}; 
       // Ids of views in listview_layout 
       // int[] to = { R.id.tv_country,R.id.iv_flag,R.id.tv_country_details}; 
       int[] to = { R.id.iv_flag}; 

       // Instantiating an adapter to store each items 
       // R.layout.listview_layout defines the layout of each item   
       SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), countries, R.layout.lv_layout, from, to); 

       return adapter; 
      } 

      /** Invoked by the Android on "doInBackground" is executed */ 
      @Override 
      protected void onPostExecute(SimpleAdapter adapter) { 

       // Setting adapter for the listview 
       mListView.setAdapter(adapter); 

       for(int i=0;i<adapter.getCount();i++){ 
        HashMap<String, Object> hm = (HashMap<String, Object>) adapter.getItem(i); 
        String imgUrl = (String) hm.get("flag_path"); 
        ImageLoaderTask imageLoaderTask = new ImageLoaderTask(); 

        HashMap<String, Object> hmDownload = new HashMap<String, Object>(); 
        hm.put("flag_path",imgUrl); 
        hm.put("position", i); 

        // Starting ImageLoaderTask to download and populate image in the listview 
        imageLoaderTask.execute(hm); 

        } 
      } 

     } 



/** AsyncTask to download and load an image in ListView */ 
     private class ImageLoaderTask extends AsyncTask<HashMap<String, Object>, Void, HashMap<String, Object>>{ 

      @Override 
      protected HashMap<String, Object> doInBackground(HashMap<String, Object>... hm) { 

       InputStream iStream=null; 
       String imgUrl = (String) hm[0].get("flag_path"); 
       int position = (Integer) hm[0].get("position"); 

       URL url; 
       try { 
        url = new URL(imgUrl); 

        // Creating an http connection to communicate with url 
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 

        // Connecting to url     
        urlConnection.connect(); 

        // Reading data from url 
        iStream = urlConnection.getInputStream(); 

        // Getting Caching directory 
        File cacheDirectory = getBaseContext().getCacheDir(); 

        // Temporary file to store the downloaded image 
        File tmpFile = new File(cacheDirectory.getPath() + "/wpta_"+position+".png"); 



        // tmpFile.getParentFile().mkdirs(); 
        // tmpFile.createNewFile(); 
        // The FileOutputStream to the temporary file 
        FileOutputStream fOutStream = new FileOutputStream(tmpFile); 

        // Creating a bitmap from the downloaded inputstream 
        Bitmap b = BitmapFactory.decodeStream(iStream);    

        // Writing the bitmap to the temporary file as png file 
        b.compress(Bitmap.CompressFormat.PNG,100, fOutStream);    

        // Flush the FileOutputStream 
        fOutStream.flush(); 

        //Close the FileOutputStream 
        fOutStream.close();    

        // Create a hashmap object to store image path and its position in the listview 
        HashMap<String, Object> hmBitmap = new HashMap<String, Object>(); 

        // Storing the path to the temporary image file 
        hmBitmap.put("flag",tmpFile.getPath()); 

        // Storing the position of the image in the listview 
        hmBitmap.put("position",position);    

        // Returning the HashMap object containing the image path and position 
        return hmBitmap;     


       }catch (Exception e) {    
        e.printStackTrace(); 
       } 
       return null; 
      } 

      @Override 
      protected void onPostExecute(HashMap<String, Object> result) { 
       // Getting the path to the downloaded image 
       String path = (String) result.get("flag");   

       // Getting the position of the downloaded image 
       int position = (Integer) result.get("position"); 

       // Getting adapter of the listview 
       SimpleAdapter adapter = (SimpleAdapter) mListView.getAdapter(); 

       // Getting the hashmap object at the specified position of the listview 
       HashMap<String, Object> hm = (HashMap<String, Object>) adapter.getItem(position); 

       // Overwriting the existing path in the adapter 
       hm.put("flag",path); 

       // Noticing listview about the dataset changes 
       adapter.notifyDataSetChanged(); 
      } 
     } 

     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      getMenuInflater().inflate(R.menu.activity_main, menu); 

      return true; 
     } 
    } 

我得到我从database.because ListViewListView内容是父视图,以便当我申请名单上观看clicklistener它得到它的每个项目的组件应用。所以我想ListView行及其组件开始不同的活动。 这里是我的适配器类:

public class CountryJSONParser { 

// Receives a JSONObject and returns a list 
public List<HashMap<String,Object>> parse(JSONObject jObject){  

    JSONArray jCountries = null; 
    try {  
     // Retrieves all the elements in the 'countries' array 
     jCountries = jObject.getJSONArray("countries"); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    // Invoking getCountries with the array of json object 
    // where each json object represent a country 
    return getCountries(jCountries); 
} 


private List<HashMap<String, Object>> getCountries(JSONArray jCountries){ 
    int countryCount = jCountries.length(); 
    List<HashMap<String, Object>> countryList = new ArrayList<HashMap<String,Object>>(); 
    HashMap<String, Object> country = null; 

    // Taking each country, parses and adds to list object 
    for(int i=0; i<countryCount;i++){ 
     try { 
      // Call getCountry with country JSON object to parse the country 
      country = getCountry((JSONObject)jCountries.get(i)); 
      countryList.add(country); 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

    return countryList; 
} 

// Parsing the Country JSON object 
private HashMap<String, Object> getCountry(JSONObject jCountry){ 

    HashMap<String, Object> country = new HashMap<String, Object>(); 

    String flag=""; 


    } catch (JSONException e) {   
     e.printStackTrace(); 
    }  
    return country; 
    } 
    } 

这里是我的XML文件:一个用于ListView等是ListView项目:

**activity_main.xml** 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" >  


    <ListView 
     android:id="@+id/lv_countries" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     tools:context=".MainActivity" 
    android:background="@drawable/gradient_drawable" 
     android:dividerHeight="1dp" 
     android:divider="#b5b5b5" /> 


</RelativeLayout> 

**lv_layout.xml** 
<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <TextView 
     android:id="@+id/tv_country" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 

     android:textSize="20dp" 
     android:textStyle="bold" /> 

    <ImageView 
     android:id="@+id/iv_flag" 
     android:layout_width="80dp" 
     android:layout_height="80dp" 

     android:layout_centerVertical="true" 
     android:padding="5dp" 
     android:contentDescription="@string/str_iv_flag" /> 


     <ImageView 
     android:id="@+id/right_arrow" 
     android:layout_width="20dp" 
     android:layout_height="20dp" 
     android:src="@drawable/arrow2" 

     android:layout_alignParentRight="true" 
     android:layout_centerVertical="true"/> 

    <TextView 
     android:id="@+id/tv_country_details" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@id/iv_flag" 

     android:layout_below="@id/tv_country" /> 

    </RelativeLayout> 

我已经尝试了How to set onClickListener for separate parts of custom listView item? [Android]后 但没有解决我的问题,因为它确实带我一个新的活动意味着什么都没有发生,也没有得到任何错误。所以请帮我解决这个问题。

+0

发布适配器类 – 2015-01-21 06:54:47

+0

您可以简单地为'ListView'调用'OnItemClickListener'方法。 – Piyush 2015-01-21 06:55:35

+0

你使用自定义的listview ...如果是的话请在这里分享适配器,如果不使用自定义listview与适配器和处理点击适配器.. – 2015-01-21 06:59:19

回答

0

从获取点击的项目的文本listviewin听众,然后采取哪些活动应该在点击开始决定,从here

lv.setOnItemClickListener(new OnItemClickListener() 
{ 
    @Override 
    public void onItemClick(AdapterView<?> a, View v, int position, long id) 
    { 
     // In the following line "v" refers to the View returned by the `getView()` method; meaning the clicked View. 
     TextView txtName = (TextView)v.findViewById(R.id.yourTextViewID); 
     String name = txtName.getText().toString(); 
     switch(name) 
     { 
       case "nameOne": 
        Intent intent = new Intent(YourCurrentActivity.this, NameOneActivity.class); 
        startActivity(intent); 
        break; 

       case "nameTwo": 
        Intent intent = new Intent(YourCurrentActivity.this, NameTwoActivity.class); 
        startActivity(intent); 
        break; 

       //And so on and so forth.... 
     } 

    } 
}); 
+0

谢谢你的帮助。但上面的代码与custombaseadapter一起工作,但在我的代码中,我没有使用这个类。所以请看我的代码,并告诉在这种情况下要做什么,如果它需要使用自定义列表适配器,并且如果是,请告诉它在哪里使用它以及它的整个代码。并很抱歉打扰你。 – 2015-01-21 07:43:59

0

采取内,您的BaseAdpter类设置onClickListener在每个项目上和在随后的onclick启动你想要这样的活动:

image1.setOnClickListener(this); 
image2.setOnClickListener(this); 
textview.ssetOnClickListener(this); 

然后

@Override 
public void onClick(View view) { 
switch(view.getId()){ 
case image1.getId(): 
mActivity.startAcivity(new Intent(mActivity,ActivityToStart.class)); 
break; 
case image2.getId(): 
mActivity.startAcivity(new Intent(mActivity,ActivityToStart.class)); 
break; 
.....and so on 
} 
} 
+0

对不起,但它没有帮助我 – 2015-01-21 07:56:56

+0

您是否将此添加到视图所属类或内部的BaseAdapter的getView? – 2015-01-21 08:22:50

+0

抱歉,但在我上面贴的代码中,我没有适配器类,所以请建议适配器类或类型(基本或自定义)的代码,这是相关的我的发布的code.I只是尝试了一个链接中给出的代码没有实际实现因为它在我的项目中给了我太多的错误。 – 2015-01-21 08:58:50

相关问题