I have a listview and two textveiws in it for two columns. My goal is to set the colour of e.g. the 5th row of the listview to blue. Details:
config.xml has the layout for the acitivty: buttons and the listview. Part of it:
<ListView android:id="#+id/ListView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="#+id/TextView01">
</ListView>
row.xml defines the two coloumns for the listview:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:paddingTop="4dip"
android:paddingBottom="6dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:id="#+id/linlay0">
<LinearLayout android:orientation="horizontal"
android:id="#+id/linlay"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="#+id/left"
android:layout_width="160px"
android:layout_height="wrap_content"
android:textColor="#FF0000"
android:paddingLeft="5px"/>
<TextView android:id="#+id/right"
android:layout_width="140px"
android:layout_height="wrap_content"
android:maxWidth="140px"
android:singleLine="false"/>
</LinearLayout>
</LinearLayout>
MainActivity.java is for the management for the activity, as well as the listview. So contentview is set to config.xml:setContentView(R.layout.config);
This is how i upload the listview with data:
lv1=(ListView)findViewById(R.id.ListView01);
ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
for (int i=0; i<31; i++)
{
HashMap<String, String> map = new HashMap<String, String>();
map.put("left1", date[i]);
map.put("right1", name[i]);
mylist.add(map);
}
simpleAdapter = new SimpleAdapter(this, mylist, R.layout.row,
new String[] {"left1", "right1"}, new int[] {R.id.left, R.id.right});
lv1.setAdapter(simpleAdapter);
date[i] and name[i] are arrays declared and uploaded at the beginning of the class.
I am running some queries, comparing arrays and now i want to the set colour of a specific row in the ListView to blue. Like i said contentview is set to config.xml, while the TextViews of the ListView is in row.xml.
So TextView txt1 = (TextView) findViewById(R.id.left); is uninterpretable for Eclipse.
I would have solved this by implemented my own adapter, and used the position parameter in the getView() method of the adapter to set the background of the LinearLayout by code.
In your CustomAdapter in getView method use this
if(position==5)
{
convertView.setBackgroundColor(Color.BLUE);
}
simpleAdapter is a system adpater,you can not control it.In my opioion,if you want set color at 5th row,you should implementation any adapter and override the getView or bindView method
,accord the position(row number) you can do anything you want
Related
Hi Hope some one can help me i'm new to Mono and Android
i can do the ListActivity with code
eg. activity.cs code looks like this
[Activity(Label = "My Activity")]
public class TestScreen : ListActivity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
string[] values = new String[] {"One", "Two", "Three"};
var list = new List<string>();
for (int i = 0; i < values.Length; ++i)
{
list.Add(values[i]);
}
ListAdapter = new ArrayAdapter<String>(this, Android.Resource.Layout.SimpleListItem1, list);
and my result is the ListActivity in a single screen
like this
Cant post images :(
Single Screen With the list
What i would like to achieve is
i would like to create a Layout
and then pull the list into the layout
like this lest call this layout custom.axml
not sure how to link the data to my layout
Cant post images :(
this layout consist of 3 objects
Button
ListView --- want to populate the list view with the list
TextView
This is your layout at the bottom, minus the XML header.
To make it work, you have to modify your OnCreate method to load your listview this way.. since you have more items in your view than just the List for your activity.
SetContentView (Resource.Layout.YourLayoutFileName);
ourlist = FindViewById<ListView> (Android.Resource.Id.List);
ourlist.Adapter = new ArrayAdapter<String>(this, Android.Resource.Layout.SimpleListItem1, list);
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:minWidth="25px"
android:minHeight="25px">
<Button
android:id="#+id/yourbutton"
android:layout_width="300dip"
android:gravity="center"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="Your Text"/>
<ListView
android:minWidth="25px"
android:minHeight="25px"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="#android:id/list" />
<TextView
android:id="#+id/txtview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="10dip"
android:textSize="20dip" />
I have a ListView inside a HorizontalScrollView, the scrollbartrack takes up a area to the right. When I change to Scrollbarstyle:insideOverlay it doesn't it still takes up the are. If I change to scrollbars:none the area disappears so I know it has something to do with the scrollbars.
I have tested with all styles on scrollbars and played around with padding and margin haven't found any way to get it to actually overlay. It seems to be the HorizontalScrollView that creates the problem if I remove that the scrollbars are overlayed correctly.
In this code I set the overlay both in xml and code but none of them seems to work.
Here is a basic working example where the problem shows up. In my real code the layout is not just green so a solution with coloring the track green wont work.
public class ScrollTest extends ListActivity {
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scroll_test);
ListView lv= getListView();
lv.setDivider(null);
//Just to make sure!
lv.setScrollBarStyle(ListView.SCROLLBARS_INSIDE_OVERLAY);
// create the grid item mapping
String[] from = new String[] {"rowid", "col_1", "col_2", "col_3", "col_4", "col_5"};
int[] to = new int[] { R.id.item1, R.id.item2, R.id.item3, R.id.item4, R.id.item5 , R.id.item6};
// prepare the list of all records
List<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>();
for(int i = 0; i < 50; i++){
HashMap<String, String> map = new HashMap<String, String>();
map.put("rowid", "" + i);
map.put("col_1", "col_1_item_" + i);
map.put("col_2", "col_2_item_" + i);
map.put("col_3", "col_3_item_" + i);
map.put("col_4", "col_4_item_" + i);
map.put("col_5", "col_5_item_" + i);
fillMaps.add(map);
}
// fill in the grid_item layout
SimpleAdapter adapter = new SimpleAdapter(this, fillMaps, R.layout.row, from, to);
lv.setAdapter(adapter);
}
}
And the relevant xml for the layout.
activty_scroll_test.xml:
<?xml version="1.0" encoding="UTF-8"?>
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="fill_parent">
<ListView
android:id="#android:id/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scrollbarStyle="insideOverlay"/>
</HorizontalScrollView>
row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:background="#android:color/holo_green_dark"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="#+id/item1"
android:text="row_id"
android:layout_height="fill_parent"
android:layout_width="wrap_content"
android:width="40dip"
android:padding="5dp"
/>
<TextView android:id="#+id/item2"
android:text="col_1"
android:layout_height="fill_parent"
android:layout_width="wrap_content"
android:width="100dip"
android:padding="5dp"
/>
<TextView android:id="#+id/item3"
android:text="col_2"
android:layout_height="fill_parent"
android:layout_width="wrap_content"
android:width="100dip"
android:padding="5dp"
/>
<TextView android:id="#+id/item4"
android:text="col_3"
android:layout_height="fill_parent"
android:layout_width="wrap_content"
android:width="100dip"
android:padding="5dp"
/>
<TextView android:id="#+id/item5"
android:text="col_4"
android:layout_height="fill_parent"
android:layout_width="wrap_content"
android:width="100dip"
android:padding="5dp"
/>
<TextView android:id="#+id/item6"
android:text="col_5"
android:layout_height="fill_parent"
android:layout_width="wrap_content"
android:width="100dip"
android:padding="5dp"
/>
</LinearLayout>
From android:scrollbarStyle (admittedly not the best documentation in Android):
When inset, they add to the padding of the view. [..] If you want them to appear at the edge of the view, ignoring the padding, then you can use outsideOverlay or outsideInset.
So, setting it to insideOverlay, with no padding on the ListView and no margins on the list items, you would get a scrollbar on top of the list items.
You can use Hierarchy Viewer to figure out where the spacing is coming from. It's likely padding or margins on the list items, namely that 5dp on #+id/item6.
I have created a list view with 3 items in each list view item using two separate .'xml's.
1) list_view.xml
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="#+id/ListView">
</ListView>
2) list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:id="#+id/relativeLayout1"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:paddingRight="10dp"
android:paddingLeft="10dp"
android:paddingTop="10dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Text here"
android:id="#+id/textView"
android:layout_alignTop="#+id/TextView"
android:layout_alignLeft="#+id/TextView"
android:layout_centerVertical="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="-"
android:id="#+id/seperator"
android:layout_alignBottom="#+id/textView"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="000"
android:id="#+id/price"
android:layout_alignParentTop="true"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="$"
android:id="#+id/prefix"
android:layout_alignParentTop="true"
android:layout_centerVertical="true"
android:layout_toLeftOf="#+id/price"/>
</RelativeLayout>
Now, I have created a list view with all the items using a 'SimpleAdapter'. Now I want to access the items in the list view (textView, separator,...) and change the color, size etc programmatically.
Here is the code of my MainActivity.java
public class MainActivity extends Activity {
public RelativeLayout relativeLayout;
public RelativeLayout.LayoutParams lp;
public SimpleAdapter mList;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_view);
ListView list = (ListView) findViewById(R.id.ListView);
//background color
list.setBackgroundColor(Color.YELLOW);
TextView itemText = (TextView)findViewById(R.id.textView);
itemText.setTypeface(Typeface.SANS_SERIF);
ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
HashMap<String, String> map = new HashMap<String, String>();
//Dummy data
//add all elements to map
map.put("text", "click to edit0");
map.put("seperator", "-");
map.put("price", "100");
// add map elements to list
mylist.add(map);
//add all elements to map
map = new HashMap<String, String>();
map.put("text", "click to edit1");
map.put("seperator", "-");
map.put("price", "102");
//add all elements to map
mylist.add(map);
map = new HashMap<String, String>();
map.put("text", "click to edit2");
map.put("seperator", "-");
map.put("price", "104");
mylist.add(map);
//use adapter to set list items
mList = new SimpleAdapter(this, mylist, R.layout.list_item,
new String[] {"text", "seperator", "price"}, new int[] {R.id.textView, R.id.seperator, R.id.price});
list.setAdapter(mList);
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
All worked fine until I tried to access the list view items and change them.
My code crashes and shows a null pointer exception at
TextView itemText = (TextView)findViewById(R.id.textView);
itemText.setTypeface(Typeface.SANS_SERIF);
I suspect this might be because I did not the setContentView to list_item.xml.
Is there a way to access the elements? If yes how?
for setting color follow the bellow code
String text = "<font color=#8469af>By tapping Checkout, you agree to our </font> <font color=#ffffff>terms.</font>";
tvTerms.setText(Html.fromHtml(text));
when you try to call findviewbyid you didnt create listitems yet so it returns null pointer
if you want to set type face with standart font use
android:typeface="serif"
but if you insist do it programmatically
first get list items from list then
(TextView) list_item.findViewById(R.id.textView);
As Talha pointed out the exception comes from the call on findViewById on this where your id textView does not exists, so it returns null
If you want to modify your list items programmatically you should implement your own adapter and apply your modifications in the getView method
I bind the data from array-list to Listview as below:
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
ListView lstView = getListView();
lstView.setChoiceMode(2);
ArrayList<String> listTODO = PrepareList();
lv_arr = (String[]) listTODO.toArray(new String[0]);
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_checked, lv_arr));
lstView.setTextFilterEnabled(true);
}
private ArrayList<String> PrepareList() {
ArrayList<String> todoItems = new ArrayList<String>();
todoItems.add("AAA");
todoItems.add("BBB");
todoItems.add("CCC");
todoItems.add("DDD");
return todoItems;
}
And the ListView have set multi-selected. I want to get the text have been selected on that Listview after button hv been clicked.
Anybody can help me to put the button below that ListView. I can't figure it out how to put the button coz it's didn't have the xml layout file.
.
add after super.onCreate
listView.setContentView(R.layout.your_custom_layout_for_listview)
take a look at this for more info
You can use a xml layout and out a button under the listview element. The only thing to make sure is to have a listview element with it
android:id="#android:id/list"
the line android:layout_weight="0.5" in ListView is very important.
<ListView
android:id="#android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:soundEffectsEnabled="true" >
</ListView>
<LinearLayout
android:id="#+id/linearLayout2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right"
android:orientation="horizontal" >
<Button
android:id="#+id/myBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="OK"
android:textSize="18dip" >
</Button>
</LinearLayout>
if you do not have xml layout, add these controls to a LinearLayout and set layout_weight in code like the following lines:
LayoutParams param = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT, 0.5f);
myBtn.setLayoutParams(param);
I'm just starting to develop on Android so this may be a very basic thing, but. . .
I'm having a really hard time setting up a ListView within a LinearLayout. Maybe it's a problem in my XML layout, or maybe it's a problem with my databinding code.
I'm confused by the many tutorials that say that my Activity should extend ListActivity. Why would this one widget require that my entire UI be changed?
The thing is, I only want the scrolling box of items to occupy a part of this one screen. Is ListView the wrong widget to use? Should I be using a ScrollView instead?
Thanks -- here's my XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFF"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="#string/enter_text"
/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
<EditText
android:id="#+id/txtTo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left"
android:layout_weight="1"
android:width="200px"/>
</LinearLayout>
<ListView android:id="#+id/listRecent"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
And here's my code:
public class MyApp extends Activity {
private String TAG = "MyApp";
//UI ELEMENTS
EditText txtTo;
ListView listRecent;
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//GET REFERENCES TO UI ELEMENTS
listRecent = (ListView) this.findViewById(R.id.listRecent);
try {
//----------------------------------------
// create the grid item mapping
String[] from = new String[] {"zero", "one", "two", "three"};
int[] to = new int[] {0, 1, 2, 3};
// prepare the list of all records
List<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>();
for(int i = 0; i < 10; i++){
HashMap<String, String> map = new HashMap<String, String>();
map.put("rowid", "" + i);
map.put("col_1", "col_1_item_" + i);
map.put("col_2", "col_2_item_" + i);
map.put("col_3", "col_3_item_" + i);
fillMaps.add(map);
}
// fill in the grid_item layout
SimpleAdapter adapter = new SimpleAdapter(this, fillMaps, R.layout.recently_dingdonged, from, to);
listRecent.setAdapter(adapter);
//----------------------------------------
}
catch(Exception e) {
Log.e(TAG, "Error here (3116019)", e);
}
}
ListView should be nested inside of scrollview. By extending listActivity you gain the ability to setAdapter and populate the data into your list view through the main object and not through instantiating the list. This is by no means a requirement though.
You don't need to make your Activity extend ListActivity. You can, but it's not necessary.
In relation with your xml, try this out:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFF"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="#string/enter_text"
/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<EditText
android:id="#+id/txtTo"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="left"
android:layout_weight="0.5"
android:width="200px"/>
</LinearLayout>
<ListView android:id="#+id/listRecent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.5" />
</LinearLayout>