2016-12-19 133 views
0

我已經使用以下教程「https://www.simplifiedcoding.net/android-volley-tutorial-to-get-json-from-server/」在Android上使用ListView和LinearLayout顯示數據。當我點擊列表中的一個項目時,我想要轉到另一個屏幕。我已將此添加到我的MainActivity中,但它不起作用:如何使用LinearLayout設置onclick(android)

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     //ListView lv = getListView(); 

     buttonGet = (Button) findViewById(R.id.buttonGet); 
     buttonGet.setOnClickListener(this); 
     listView = (ListView) findViewById(R.id.listView); 
     linearLayout = (LinearLayout) findViewById(R.id.linearLayout); 
     sendRequest(); 

     linearLayout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(MainActivity.this, EventDetails.class); 
       MainActivity.this.startActivity(intent); 
      } 
     }); 

    } 
+1

一個LinearLayout中不應該是一個ListView的替代品。除此之外,你的代碼看起來很好。 –

+0

你的代碼會再次啓動MainActivity,這是你想要的嗎? – m0skit0

+0

@ m0skit0它會開始'EventDetails' –

回答

1

您必須將LinearLayout設置爲可點擊。您可以在LinearLayout中標籤

android:clickable="true" 

或者在代碼中加入下面

linearLayout.setClickable(true); 
+0

我試過這個,但仍然沒有工作 – kevin

1

該教程使用一個ListView,而不是一個LinearLayout中做到這一點的XML。

您將Item-ClickListeners添加到ListViews。

final Context ctx = YourActivity.this; 
yourListView = (ListView) findViewById... 

yourListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     Data clicked = adapter.getItem(position); 

     // Do something with 'clicked' 

     // startActivity(ctx, ShowDataActivity.class); 
    } 
}); 

int example_layout = android.R.simple_list_item_1; 
adapter = new ArrayAdapter<Data>(ctx, example_layout, new ArrayList<Data>()); 
yourListView.setAdapter(adapter); 

順便說一句,that tutorial uses a deprecated version of Volley

+0

什麼是你的意思是depracated版本,有什麼其他的方式可以告訴我怎麼做嗎?謝謝 – kevin

+0

「**不推薦使用某些功能,設計或實踐」 - 「不再被認爲是安全的」 - 在軟件中,「不再維護或鼓勵一般使用」。你仍然可以使用Volley,但是[**點擊鏈接**](https://github.com/mcxiaoke/android-volley/blob/master/README.md),你會看到「棄用」這個詞,它說什麼來代替。 –

0

您可以實現一個公共接口來管理適配器元素的click事件。要做到這一點,定義適配器一個公共接口(在本教程是CustomList類)

public class CustomList extends ArrayAdapter<String> { 


public interface OnClickOnItemList 
{ 
    public void clickInView(View v,int position); 
} 

private OnClickOnItemList mListener; 
public setOnClickOnItemListener(OnClickOnItemList l) {this.mListener = l} 
/*...*/ 

} 

而且在同一個班去getView。您應該分配新監聽到事件的onclick

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = context.getLayoutInflater(); 
    View listViewItem = inflater.inflate(R.layout.list_view_layout, null, true); 

    linearLayout = (LinearLayout) listViewItem.findViewById(R.id.linearLayout); 
    /*Rest of subviews*/ 


    /*Linear Layout now will call the new listener*/ 
    linearLayout.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mListener.clickInView(listViewItem,position); 
     } 
    }); 

    return listViewItem; 
} 
} 

隨後,主要活動必須實現這個公共接口

public class MainActivity extends AppCompatActivity implements CustomList.OnClickOnItemList 
{ 

/*Code*/ 
@Override 
public void clickInView(View v,int position) 
{ 
    Intent intent = new Intent(MainActivity.this, EventDetails.class); 
    startActivity(intent); 
} 

private void showJSON(String json){ 
    ParseJSON pj = new ParseJSON(json); 
    pj.parseJSON(); 
    CustomList cl = new CustomList(this, ParseJSON.ids,ParseJSON.names,ParseJSON.emails); 
    cl.setOnClickOnItemListener(this); 
    listView.setAdapter(cl); 
} 

} 
+0

當我嘗試聲明LinearLayout linearLayout =(LinearLayout)findViewById(R.id.linearLayout)。我在findViewById中得到一個錯誤,我該如何解決這個問題 – kevin

+0

什麼樣的錯誤?嘗試更具體。 – Exensor

+0

這行代碼:public setOnClickOnItemListener(OnClickOnItemList l){this.mListener = l;}。我收到一條錯誤消息:「android.widget.ArrayAdapter」中沒有默認構造函數。 – kevin

相關問題