簡體   English   中英

如何在Android中為Listview項的單獨組件(部分)啟動新活動

[英]How to start a new activity for separate components (parts) of listview items in Android

我已經為我的Android應用制作了ListView ,但是在為項目的不同部分創建單獨的onClickListeners遇到問題。 我的物品有一個image1,image2和一個文本。 我想要的是根據單擊了哪些活動來啟動不同的活動。 下面是我的代碼。

 **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;
        }
    }

我從數據庫獲取ListView內容。因為ListView是父視圖,所以當我在列表視圖上應用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>

我已經嘗試了如何為自定義listView項的單獨部分設置onClickListener?[Android]帖子,但它沒有解決我的問題,因為它確實帶我進行了新活動,意味着什么也沒發生,而且我也沒有收到任何error.so請幫我解決這個問題。

從偵聽器的列表視圖中獲取被單擊項的文本,然后確定應該在單擊時啟動哪個活動,從此處獲取

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....
         }

    }
});

在BaseAdpter類中,在每個Item上設置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
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM