2014-07-07 4 views
0

제 애플리케이션에서 서버로부터 가치를 얻고이를 테이블 레이아웃 형태로 표시하고 있습니다. 나는 어디서나 가치를 저장하지 않는다. 각 행의 시작 부분에 버튼이 있으며 사용자가 해당 버튼을 누르면 첫 번째 열과 첫 번째 행의 값이 변수에 삽입되어야합니다. "product_code"라는 필드의 값을 변수에 저장하려고합니다.버튼 클릭 이벤트에서 tablelayout에서 값을 가져 오는 중 오류가 발생했습니다.

죄송합니다. 여기 내 코드

public class FancyStock extends Activity implements View.OnClickListener { 

    String data = ""; 
    TableLayout tl; 
    TableRow tr; 
    TextView label; 
    Button btn; 
    ArrayList<Users_fancystock> users = new ArrayList<Users_fancystock>(); 



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

     tl = (TableLayout) findViewById(R.id.main_table); 

     final GetDatafromDB_fancystock getdb = new GetDatafromDB_fancystock(); 
     new Thread(new Runnable() { 
      public void run() { 
       data = getdb.getDataFromDB(); 
       System.out.println(data); 

       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         ArrayList<Users_fancystock> users = parseJSON(data); 
         addData(users); 
        } 
       }); 

      } 
     }).start(); 



    } 

    public ArrayList<Users_fancystock> parseJSON(String result) { 
     ArrayList<Users_fancystock> users = new ArrayList<Users_fancystock>(); 
     try { 
      JSONArray jArray = new JSONArray(result); 
      for (int i = 0; i < jArray.length(); i++) { 
       JSONObject json_data = jArray.getJSONObject(i); 
       Users_fancystock user = new Users_fancystock(); 
       user.setId(json_data.getInt("id")); 
       user.setProduct_code(json_data.getString("product_code")); 
       user.setShapes(json_data.getString("shaps")); 
       user.setPair(json_data.getString("pair")); 
       user.setCarats(json_data.getString("carats")); 
       user.setColor(json_data.getString("color")); 
       user.setClarity(json_data.getString("clarity")); 
       user.setService(json_data.getString("service")); 
       user.setPolish(json_data.getString("polish")); 
       user.setSymetric(json_data.getString("symetric")); 
       user.setTables(json_data.getString("tables")); 
       user.setMeasurements(json_data.getString("measurments")); 
       user.setFlourscne(json_data.getString("flourscne")); 
       user.setDescription(json_data.getString("description")); 
       user.setCerticated(json_data.getString("certificated")); 
       user.setCcode(json_data.getString("ccode")); 
       user.setCut(json_data.getString("cut")); 
       user.setTotal(json_data.getString("total")); 
       user.setFile(json_data.getString("file")); 
       users.add(user); 
      } 
     } catch (JSONException e) { 
      Log.e("log_tag", "Error parsing data " + e.toString()); 
     } 
     return users; 
    } 



    void addHeader(){ 
     /** Create a TableRow dynamically **/ 
     tr = new TableRow(this); 

     TextView add = new TextView(this); 
     add.setText("Add"); 
     add.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, 
       LayoutParams.WRAP_CONTENT)); 
     add.setPadding(5, 5, 5, 5); 
     add.setBackgroundColor(Color.parseColor("#BDB76B")); 
     LinearLayout Ll = new LinearLayout(this); 
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 
       LayoutParams.WRAP_CONTENT); 
     params.setMargins(0, 5, 5, 5); 
     //Ll.setPadding(10, 5, 5, 5); 
     Ll.addView(add,params); 
     tr.addView((View)Ll); 

     /** Creating a TextView to add to the row **/ 
     label = new TextView(this); 
     label.setText("Product code"); 

     label.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, 
       LayoutParams.WRAP_CONTENT)); 
     label.setPadding(5, 5, 5, 5); 
     label.setBackgroundColor(Color.parseColor("#BDB76B")); 
     Ll = new LinearLayout(this); 
     params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 
       LayoutParams.WRAP_CONTENT); 
     params.setMargins(5, 5, 5, 5); 
     //Ll.setPadding(10, 5, 5, 5); 
     Ll.addView(label,params); 
     tr.addView((View)Ll); // Adding textView to tablerow. 

     /** Creating Qty Button **/ 
     TextView shapes = new TextView(this); 
     shapes.setText("Shapes"); 
     shapes.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, 
       LayoutParams.WRAP_CONTENT)); 
     shapes.setPadding(5, 5, 5, 5); 
     shapes.setBackgroundColor(Color.parseColor("#BDB76B")); 
     Ll = new LinearLayout(this); 
     params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT); 
     params.setMargins(0, 5, 5, 5); 
     //Ll.setPadding(10, 5, 5, 5); 
     Ll.addView(shapes,params); 
     tr.addView((View)Ll); // Adding textview to tablerow. 

     TextView pair = new TextView(this); 
     pair.setText("Shapes"); 
     pair.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
     pair.setPadding(5, 5, 5, 5); 
     pair.setBackgroundColor(Color.parseColor("#BDB76B")); 
     Ll = new LinearLayout(this); 
     params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT); 
     params.setMargins(0, 5, 5, 5); 
     //Ll.setPadding(10, 5, 5, 5); 
     Ll.addView(pair,params); 
     tr.addView((View)Ll); // Adding textview to tablerow. 




     // Add the TableRow to the TableLayout 
     tl.addView(tr, new TableLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 
    } 

    @SuppressWarnings({ "rawtypes" }) 
    public void addData(ArrayList<Users_fancystock> users) { 

     addHeader(); 

     for (Iterator i = users.iterator(); i.hasNext();) { 
      for (int j = 0; j < users.size(); j++) { 

       Users_fancystock p = (Users_fancystock) i.next(); 

       /** Create a TableRow dynamically **/ 
       tr = new TableRow(this); 

///-----------------------buttpm here------------------------------------------------------- 
       Button btn = new Button(this); 
       btn.setTag(j); 
       System.out.println(btn.getTag()); 

       btn.setText("Add to Basket"); 
       // btn.setTextSize(); 
       btn.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12); 
       // btn.setTag(mLinks.get(index)); 
       btn.setOnClickListener(this); 
       LinearLayout Ll = new LinearLayout(this); 
       LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 
         LayoutParams.WRAP_CONTENT); 
       params.setMargins(5, 2, 2, 2); 
       params.width = 200; 
       params.height = 60; 
       // btn.setLayoutParams(new LinearLayout.LayoutParams(10, 100)); 
       Ll.addView(btn, params); 

       tr.addView((View) Ll); 


       /** Creating a TextView to add to the row **/ 
       label = new TextView(this); 
       label.setText(p.getproduct_code()); 
       label.setId(p.getId()); 
       label.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, 
         LayoutParams.WRAP_CONTENT)); 
       label.setPadding(5, 5, 5, 5); 
       ////label.setBackgroundColor(Color.parseColor("#BDB76B")); 
       Ll = new LinearLayout(this); 
       params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 
         LayoutParams.WRAP_CONTENT); 
       params.setMargins(5, 2, 2, 2); 
       //Ll.setPadding(10, 5, 5, 5); 
       Ll.addView(label, params); 
       tr.addView((View) Ll); // Adding textView to tablerow. 

       /** Creating Qty Button **/ 
       TextView place = new TextView(this); 
       place.setText(p.getShapes()); 
       place.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, 
         LayoutParams.WRAP_CONTENT)); 
       place.setPadding(5, 5, 5, 5); 
       // place.setBackgroundColor(Color.parseColor("#BDB76B")); 
       Ll = new LinearLayout(this); 
       params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 
         LayoutParams.WRAP_CONTENT); 
       params.setMargins(0, 2, 2, 2); 
       //Ll.setPadding(10, 5, 5, 5); 
       Ll.addView(place, params); 
       tr.addView((View) Ll); // Adding textview to tablerow. 

       label = new TextView(this); 
       label.setText(p.getpair()); 
       label.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, 
         LayoutParams.WRAP_CONTENT)); 
       label.setPadding(5, 5, 5, 5); 
       ////label.setBackgroundColor(Color.parseColor("#BDB76B")); 
       Ll = new LinearLayout(this); 
       params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 
         LayoutParams.WRAP_CONTENT); 
       params.setMargins(5, 2, 2, 2); 
       //Ll.setPadding(10, 5, 5, 5); 
       Ll.addView(label, params); 
       tr.addView((View) Ll); // Adding textView to tablerow. 



       // Add the TableRow to the TableLayout 
       tl.addView(tr, new TableLayout.LayoutParams(
         LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 
      } 
     } 
    } 
    public void onClick(View v) 
    { 
     int k=(Integer)btn.getTag(); 
     Users_fancystock rowRecord= users.get(k); 
     System.out.println(rowRecord); 

    } 
} 

것은 여기

07-07 09:12:45.950 13184-13184/com.diamond.traders D/AndroidRuntime﹕ Shutting down VM 
07-07 09:12:45.950 13184-13184/com.diamond.traders W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x415dcba8) 
07-07 09:12:45.950 13184-13184/com.diamond.traders E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.diamond.traders, PID: 13184 
    java.lang.NullPointerException 
      at com.diamond.traders.FancyStock.onClick(FancyStock.java:669) 
      at android.view.View.performClick(View.java:4438) 
      at android.view.View$PerformClick.run(View.java:18422) 
      at android.os.Handler.handleCallback(Handler.java:733) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5001) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
      at dalvik.system.NativeStart.main(Native Method) 

새로운 오류 내 오류 당신은 btn 필드를 지정하지 않은

07-07 09:36:53.845 15932-15932/com.diamond.traders E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.diamond.traders, PID: 15932 
    java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0 
      at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
      at java.util.ArrayList.get(ArrayList.java:308) 
      at com.diamond.traders.FancyStock.onClick(FancyStock.java:670) 
      at android.view.View.performClick(View.java:4438) 
      at android.view.View$PerformClick.run(View.java:18422) 
      at android.os.Handler.handleCallback(Handler.java:733) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5001) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
      at dalvik.system.NativeStart.main(Native Method) 

답변

1

입니다.

클릭 한 버튼의 태그가 필요하므로 대신 v.getTag()을 사용하십시오 (제공된 v은 클릭 한보기 임).

변경이이에

int k = (Integer)btn.getTag(); 

는 :

int k = (Integer)v.getTag(); 

나는 또한 클래스의 시작 Button btn;을 제거하는 것이 좋습니다.

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     ArrayList<Users_fancystock> users = parseJSON(data); 
     addData(users); 
    } 
}); 

당신은 파일의 맨 위에 정의 된 users 필드를 업데이트하지 않는 :

적어도 하나 더 문제가 있습니다. 이 실행 파일은 다음과 같아야합니다.

public void run() { 
     users = parseJSON(data); 
     addData(users); 
    } 
+0

죄송합니다. 귀하의 답변을 이해할 수 없습니다. 코드를 사용하여 설명해 주시겠습니까 ?? 나는 영어로 좋지 않다. –

+0

나는 버튼 클릭에 그 필드의 가치를 얻고 싶다. 왜 내가 clickview에 그것을 추가했는지. –

+0

'v'가 버튼이다. – matiash