Knappar i listview item

Diskussion i 'Frågor, support och diskussion' startad av Pajn, 12 dec 2011.

  1. Pajn

    Pajn Adult Droid Medlem

    Blev medlem:
    12 aug 2009
    Inlägg:
    606
    Mottagna gillanden:
    51

    MINA ENHETER

  2. Pajn

    Pajn Adult Droid Medlem

    Blev medlem:
    12 aug 2009
    Inlägg:
    606
    Mottagna gillanden:
    51

    MINA ENHETER

    Vad jag har nu
    Kod:
    package com.pajn.raxa.mobile;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.http.HttpVersion;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.params.BasicHttpParams;
    import org.apache.http.params.CoreProtocolPNames;
    import org.apache.http.params.HttpParams;
    
    import android.app.ListActivity;
    import android.content.Context;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.TextView;
    
    public class Devices extends ListActivity {
        
       	// the class that opens or creates the database and makes sql calls to it
       	DatabaseManager db;
       	
       	ArrayList<ArrayList<Object>> data;
       	
        /** Called when the activity is first created. */
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		
            // create the database manager object
            db = new DatabaseManager(this);
            
    	    List<String> devices = new ArrayList<String>();
    	  
    	    // collect the current row information from the database and
    	    // store it in a two dimensional ArrayList
    	    data = db.getDevices();
    	  
      	  	// iterate the ArrayList, create new rows each time and add them
      	  	// to the table widget.
      	  	for (int position=0; position < data.size(); position++)
      	  	{
      	  		ArrayList<Object> row = data.get(position);
      		    devices.add(row.get(3).toString());
      	  	}
    	  
      	  	super.onCreate(savedInstanceState);
    
      	  	setListAdapter(new DeviceAdapter(this, R.layout.device_item, devices));
    
      	  	ListView lv = getListView();
      	  	lv.setTextFilterEnabled(true);
    	}
    	
    	public class DeviceAdapter extends ArrayAdapter<String> {
    		private List<String> Devices;
    		private Context context;
    
    		public DeviceAdapter(Context context, int textViewResourceId, List<String> Devices) {
    			super(context, textViewResourceId, Devices);
    			this.context = context;
    			this.Devices = Devices;
    		}
    
    		@Override
    		public View getView(int position, View convertView, ViewGroup parent) {
    			final int pos = position;
    			View v = convertView;
    			if (v == null) {
    				LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    				v = vi.inflate(R.layout.device_item, null);
    			}
    			
    			TextView devicename = (TextView) v.findViewById(R.id.devicename);
    			devicename.setText(Devices.get(position));
    
    			com.pajn.raxa.mobile.NoParentPressImageView on = (NoParentPressImageView) findViewById(R.id.OnButton);
    	  	    com.pajn.raxa.mobile.NoParentPressImageView off = (NoParentPressImageView) findViewById(R.id.OffButton);
    	  	    com.pajn.raxa.mobile.NoParentPressImageView dim = (NoParentPressImageView) findViewById(R.id.DimButton);
    	  	  	
    	  	    on.setOnClickListener(new View.OnClickListener() {
    				@Override
    				public void onClick(View v) {
    		  	        String dID = data.get(pos).get(1).toString();
    	            	HttpParams params = new BasicHttpParams();
    	            	params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
    	            	HttpClient httpclient = new DefaultHttpClient(params);
    	                String URL = "http://***.eu/action.php?device=" + dID + "&cmd=1&dim=15";
    	                HttpPost post = new HttpPost(URL);
    	                try {
    	                	httpclient.execute(post);
    					} catch (ClientProtocolException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					} catch (IOException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    				}
    	  	  	});
    	  	  	
    	  	    off.setOnClickListener(new OnClickListener() {
    				@Override
    				public void onClick(View v) {
    		  	        String dID = data.get(pos).get(1).toString();
    	            	HttpParams params = new BasicHttpParams();
    	            	params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
    	            	HttpClient httpclient = new DefaultHttpClient(params);
    	                String URL = "http://***.eu/action.php?device=" + dID + "&cmd=0&dim=15";
    	                HttpPost post = new HttpPost(URL);
    	                try {
    	                	httpclient.execute(post);
    					} catch (ClientProtocolException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					} catch (IOException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    				}
    	  	  	});
    	  	    
    			return v;
    		}
    	}
    
    }
    
    [/CODE]

    Vad som händer:
    Kod:
    12-12 22:25:50.055: E/AndroidRuntime(859): Uncaught handler: thread main exiting due to uncaught exception
    12-12 22:25:50.067: E/AndroidRuntime(859): java.lang.NullPointerException
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at com.pajn.raxa.mobile.Devices$DeviceAdapter.getView(Devices.java:91)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at android.widget.AbsListView.obtainView(AbsListView.java:1274)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at android.widget.ListView.makeAndAddView(ListView.java:1668)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at android.widget.ListView.fillDown(ListView.java:637)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at android.widget.ListView.fillFromTop(ListView.java:694)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at android.widget.ListView.layoutChildren(ListView.java:1521)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at android.widget.AbsListView.onLayout(AbsListView.java:1113)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at android.view.View.layout(View.java:6830)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at android.view.View.layout(View.java:6830)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at android.widget.LinearLayout.onLayout(LinearLayout.java:918)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at android.view.View.layout(View.java:6830)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at android.view.View.layout(View.java:6830)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at android.view.ViewRoot.performTraversals(ViewRoot.java:996)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at android.os.Looper.loop(Looper.java:123)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at android.app.ActivityThread.main(ActivityThread.java:4363)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at java.lang.reflect.Method.invokeNative(Native Method)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at java.lang.reflect.Method.invoke(Method.java:521)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    12-12 22:25:50.067: E/AndroidRuntime(859): 	at dalvik.system.NativeStart.main(Native Method)
    
    Är jag helt ute och cycklar eller är det bara ett par småändringar som behövs?
     
    Last edited: 12 dec 2011
  3. Pajn

    Pajn Adult Droid Medlem

    Blev medlem:
    12 aug 2009
    Inlägg:
    606
    Mottagna gillanden:
    51

    MINA ENHETER

    Forumet verkar bugga så ni får skrolla i kodrutan för allt hamnade tydligen i den. Även fast det finns en [/ CODE ]
     
  4. ozp

    ozp Teen Droid Medlem

    Blev medlem:
    6 maj 2010
    Inlägg:
    250
    Mottagna gillanden:
    31

    MINA ENHETER

    Om du vänder dig till Android 1.6+ skulle jag använde android onClick på knapparna och implementera en klickfunktion i aktiviteten. Där kan du sedan använda getListView().getPositionForView(view) för att ta fram vilken position knappen har. Se kod nedan.

    Två andra reflektioner jag har på din kod. Nu vet jag inte hur din databasimplementation ser ut, men varför sparar du över datan i en ArrayList. Du kan använda en CursorAdapter för att binda till databasen direkt istället.

    Sen ska du nog inte göra http-anropen i ui-tråden för din app kommer att hänga sig tills de returnerar, med risk för anr:er. Alla tidskrävande anrop ska göras i en AsyncTask eller en bakgrundstråd.

    Kod:
    import java.util.ArrayList;
    
    import android.app.ListActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.ArrayAdapter;
    
    public class TestLista extends ListActivity {
    
    	private ArrayList<String> mArrayList;
    
    	private ArrayAdapter<String> mAdapter;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		// TODO Auto-generated method stub
    		super.onCreate(savedInstanceState);
    
    		mArrayList = new ArrayList<String>();
    		mArrayList.add("Item 1");
    		mArrayList.add("Item 2");
    		mArrayList.add("Item 3");
    
    		mAdapter = new ArrayAdapter<String>(this, R.layout.list_item,
    				R.id.text, mArrayList);
    
    		setListAdapter(mAdapter);
    	}
    
    	public void buttonClick(View view) {
    		Log.i("Oscar", "button " + getListView().getPositionForView(view) + " clicked");
    
    	}
    }

    HTML:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal" >
    
        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Klicka"
            android:onClick="buttonClick" />
    
        <TextView
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
    </LinearLayout>
     
    Pajn gillar detta.
  5. Pajn

    Pajn Adult Droid Medlem

    Blev medlem:
    12 aug 2009
    Inlägg:
    606
    Mottagna gillanden:
    51

    MINA ENHETER

    Anledningen till att jag sparar över i en ArrayList är att det var så i guiden till databashanteringen som jag följde.

    Jag skulle gärna flytta över http-anropen i en annan tråd men jag vet inte hur det funkar. men jag ska försöka titta på det när jag fått själva grundfunktionen vettig.

    Bra lösning på knapparna. Ska testa det när jag kommer hem :)

    OT: Är det bara för mig som tråden är helt upfuckad?

    EDIT: Det funkar mycket bra!
    Dessutom verkar tråden ha lagats (förut var ditt inlägg+ svara rutan inne i min kodruta)
     
    Last edited: 13 dec 2011